【问题标题】:mapply with two lists and a data frame带有两个列表和一个数据框的映射
【发布时间】:2015-04-21 11:44:07
【问题描述】:

我正在尝试编写一个在 mapply 中使用的函数,该函数涉及两个列表和一个数据框。我想挑选出由两个列表(用于行和列)索引的几个数据子集。这是我想在循环中执行的操作的示例,以及我对该函数的尝试:

#simulated data and column, row indexes
set.seed(100)
d <- data.frame(matrix(1:100,nrow=10,ncol=10))
y <- lapply(vector("list", 5),function(x){sample(1:10,5)}) 
x <- as.list(c(1,3,5,7,9),length=5)

# version in loop
whatiwant <- list(length=5)
for (i in 1:5){
   whatiwant[[i]] <- d[y[[i]],x[[i]]]
}

fun <- function(x,y,d){d[y,x]}

whatiwant2 <- mapply(fun,y,x,MoreArgs=d)

根据给出的错误,我怀疑 mapply 正在尝试将此函数应用于 d 的每一列;我该如何避免这种情况?如果我只索引一个维度(例如行)和单个列,则使用 lapply 的等价物是:

onedim <- lapply(y,function(d,y){d[y]},d=d[,1])

【问题讨论】:

    标签: r


    【解决方案1】:

    MoreArgs 参数需要一个包含附加参数的列表。由于 data.frame 是一个列表,mapply 认为 data.frame 列是附加参数并抱怨该函数不使用这些参数。您需要将 data.frame 包装在 list 中。您还应该设置SIMPLIFY = FALSE 以获取返回的列表。

    whatiwant2 <- mapply(fun, y = y, x = x, MoreArgs=list(d), SIMPLIFY = FALSE)
    #[[1]]
    #[1]  7 10  4  6  3
    #
    #[[2]]
    #[1] 21 29 26 27 30
    #
    #[[3]]
    #[1] 48 47 45 42 50
    #
    #[[4]]
    #[1] 62 70 69 67 66
    #
    #[[5]]
    #[1] 86 90 89 88 81
    

    【讨论】:

    • 好提示。我得到了不同的结果。例如[[5]] [1] 83 87 88 89 85我用过fun &lt;- function(x,y,d){d[y,x]}mapply(fun, y = y, x = x, MoreArgs=list(d), SIMPLIFY = FALSE)
    • 这并不奇怪。您的示例输入不可重现,因为您没有设置随机种子。
    • 真相。我还找到了另一种没有MoreArgs 混淆的方法来获得结果。没有必要让d 成为一个论点。 fun &lt;- function(x,y){d[y,x]}mapply(fun, x, y, SIMPLIFY=F)@Roland,你怎么看?
    • @plafort 把它作为一个论点是更好的做法(实际上我对他们这样做印象深刻)。那样做范围更安全。
    • 我在原始问题中添加了 set.seed() 以提高可重复性以供将来参考。谢谢。
    猜你喜欢
    • 2018-09-27
    • 2021-11-19
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多