2017-04-02 75 views
1

R的新功能有一些基本和愚蠢的問題。希望我能從這裏的所有經驗豐富的大師那裏學習,並在不久的將來成爲對所有其他數據專家有所幫助的人。在應用函數中使用%的%的正確方法

我的目標是檢查test的每一行,如果idid_lag列在同一行。我的示例代碼如下:

test <- as.data.frame(matrix(NA,10,3)) 
names(test) <- c("Year","id","id_lag") 
test[,1] <- c(2011,2012,2013,2010,2014,2015,2016,2010,2011,2012) 
test[,2] <- c(76,560,342,7908,200,23,23,890,780,150) 
test[,3] <- c("76,89","209,2000,400","342,333,234","908,888","","23","8097,5678","12","780,209","150,4504") 

involved <- function(id,id_lag) 
{ 
a <- return(id %in% scan(what = "", sep = ",",text = id_lag)) 
return(a) 
} 



check <- apply(test, 1, function(x,y) involved(test$id,test$id_lag)) 

我期待一個1×10列表作爲TRUEFALSE如果該行還是不中列出。但是,我得到一個10×10的矩陣,其中TRUEFALSE可以掃描整個列表10次。有沒有什麼辦法可以消除這個應用函數只能通過行掃描而不是完整掃描整個列表?還是有沒有更好的辦法說data.tables等工作?

謝謝,

回答

1

apply(X, MARGIN, FUN, ...)應用一個函數跨矩陣的行如果MARGIN = 1和跨各列如果MARGIN = 2

您與

check <- apply(test, 1, function(x,y) involved(test$id,test$id_lag)) 

是做什麼?「調用該函數involved(test$id,test$id_lag)text矩陣中的每一行」。所以你最終得到一個10x10矩陣,因爲你已經爲test的10行中的每一行調用了involved(test$id,test$id_lag)一次。

如果您希望跨行應用函數,同時將多個列的元素作爲每個函數調用的參數,則mapply()是一個有用的函數。也許是這樣的:

mapply(function(x,y) involved(x,y), x = test$id, y = test$id_lag) 
+0

將探討更多的應用函數系列。謝謝! – Anne

相關問題