在apply函数中使用%in%的正确方法

时间:2017-04-02 03:07:00

标签: r function apply scanf

R的新手有一些基本和愚蠢的问题。希望我能从这里所有经验丰富的大师那里学习,并在不久的将来成为可以为所有其他数据专家提供帮助的人。

我的目标是检查test的每一行,如果id列在同一行的id_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,如果它在此行中列出或不是。但是,我使用TRUEFALSE得到10 x 10矩阵,扫描整个列表10次。有什么方法可以消除这个应用功能只扫描线而不是完整扫描整个列表?或者有没有更好的方法说data.tables等可以工作?

谢谢,
安妮

1 个答案:

答案 0 :(得分:1)

apply(X, MARGIN, FUN, ...)MARGIN = 1的矩阵行和MARGIN = 2的列中应用函数。

你做了什么

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

&#34;为involved(test$id,test$id_lag)矩阵&#34;的每一行调用函数text。因此,您最终得到一个10x10矩阵,因为您已为{10} involved(test$id,test$id_lag)行中的每一行调用test一次。

如果要在一行中应用函数,同时将多列的元素作为每个函数调用的参数,mapply()是一个有用的函数。也许是这样的事情:

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