【问题标题】:The correct way of using %in% within apply function在 apply 函数中使用 %in% 的正确方法
【发布时间】:2017-04-02 03:07:00
【问题描述】:

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

谢谢,
安妮

【问题讨论】:

    标签: r function apply scanf


    【解决方案1】:

    apply(X, MARGIN, FUN, ...) 如果MARGIN = 1 跨矩阵行应用函数,如果MARGIN = 2 跨列应用函数。

    你做了什么

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

    是“为text 矩阵的每一行调用函数involved(test$id,test$id_lag)”。所以你最终得到了一个 10x10 矩阵,因为你为 test 的 10 行中的每一行调用了一次 involved(test$id,test$id_lag)

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

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

    【讨论】:

    • 将在 apply 函数系列上进行更多探索。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多