2016-02-12 87 views
1

我有兩個變量x和y的函數:R:在功能應用兩個變量

fun1 <- function(x,y) { 
    z <- x+y 
    return(z) 
} 

功能做工精細本身:

fun1(15,20) 

但是當我嘗試使用它有兩個向量x和y與應用功能我沒有得到正確的56 * 121陣列

Lx <- c(1:56) 
Ly <- c(1:121) 

mapply(fun1, Lx, Ly) 

我會是你的幫助的感謝d也建議最快的解決方案(例如,data.table或dplyr解決方案比應用更快)。

+4

想您所想'outer':'外(LX,LY,FUN1)'或[此Q/A(http://stackoverflow.com/questions/ 34858734 /加總子向量對的一矢量-在-R) – rawr

回答

3

如果你想使用mapply(),你必須爲它提供的是具有相同的尺寸參數ñ名單,以及將被N傳遞給函數N,如:

mapply(fun1,c(1,2,3), c(4, 5, 6)) 
[1] 5 7 9 

或一個參數可以是標量,如:

mapply(fun1,c(1,2,3), 4) 
[1] 5 6 7 

既然你想使用的LxLy所有組合,你可以遍歷一個列表,然後遍歷,其他像:

sapply(Lx, function(x) mapply(fun1,x,Ly)) 

sapply(Ly, function(y) mapply(fun1,Lx,y)) 

產生相同的結果RAWR命題

outer(Lx, Ly, fun1) 

其中outer()快得多

0

使用dplyr對於這個問題,因爲你描述它,很奇怪。您似乎想要使用向量,而不是數據幀,並且dplyr函數期望data.frames進入並返回data.frames,即它的輸入和輸出是冪等的。爲了處理矢量,你應該使用outer。但dplyr可以被硬塞進完成這個任務......

# define variables 
Lx <- c(1:56) 
Ly <- c(1:121) 
dx <- as.data.frame(Lx) 
dy <- as.data.frame(Ly) 

require(dplyr) 
require(magrittr) # for the %<>% operator 

# the dplyr solution 
(dx %<>% mutate(dummy_col = 1)) %>% 
    full_join(
     (dy %<>% mutate(dummy_col = 1)), by='dummy_col') %>% 
    select(-dummy_col) %>% 
    transmute(result = Lx + Ly) 
0

那麼你正在使用不同長度的載體,但也許這將幫助,如果我理解正確。我只是做了具有可變dumby功能我

fun1 <- function(x,y) { 
    z <- x+y 
    return(z) 
} 


fun1(15,20) 


Lx <- c(1:56) 
Ly <- c(1:121) 


fun1I <- function(x,y,i) 
{ 


    fun1(x[i],y[i]) 


} 


fun1IR <- function(x,y) 
{ 


    function(i)fun1I(x=x,y=y,i=i) #return dumby function 

} 



testfun <- fun1IR(Lx,Ly) # creates function with data Lx and Ly in variable i 

mapply(testfun, 1:min(length(Lx),length(Ly)))