2017-04-02 72 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

相关问题