2017-10-16 145 views
-1

我想使用apply而不是for循環。問題是,我的for-loop使用兩個data.frames作爲輸入。例如:R:使用apply兩個data.frames

x <- data.frame(col1=c(1,NA,3,NA), col2=c(9,NA,11,12)) 
y <- data.frame(col1=c(1,2,3,4), col2=c(5,6,7,8)) 
output <- rep(NA,2) 
for(i in 1:2) 
{ 
    output[i] <- sum(is.na(x[,i]))+sum(y[,i]) 
} 

這裏的結果是正確的c(12,27)。

但如果我嘗試的功能和應用:

test <- function(vector1,vector2) sum(is.na(vector1))+sum(vector2) 
apply(x,y,MARGIN=2,FUN=test) 

隨着應用的結果是C(38,37)。 我該如何解決這個問題?

+1

'apply'不能把多個數據集。您可能需要循環遍歷列,然後應用函數,即'sapply(seq_along(x),function(i)sum(is.na(x [,i]))+ sum(y [,i])) ' – akrun

回答

0

可以mapply使用,而不是適用:當你表現出

x <- data.frame(col1=c(1,NA,3,NA), col2=c(9,NA,11,12)) 
y <- data.frame(col1=c(1,2,3,4), col2=c(5,6,7,8)) 
test <- function(vector1,vector2) sum(is.na(vector1))+sum(vector2) 
mapply(test, x, y) 

# col1 col2 
# 12 27 

?mapply

+0

謝謝!脈衝總是按列排列? –

+0

'?mapply'告訴你它應用'FUN'(本例中爲'test'),其中'x'和'y'的第一個元素作爲第一個參數,第二個元素第二個,等等。由於'data.frame's是以列作爲元素的列表('is.list(data.frame())'),因此它將逐列顯示。 – AdagioMolto