使用两个列表和一个数据框

时间:2015-04-21 11:44:08

标签: r

我正在尝试编写一个在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的每一列;我怎么避免这个?如果我只是索引一个维度(.e.g行)和一个列,那么使用lapply的等价物将是:

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

1 个答案:

答案 0 :(得分:4)

MoreArgs参数需要包含aditional参数的列表。由于data.frame是一个列表,mapply认为data.frame列是附加参数并且抱怨该函数不使用这些参数。您需要在list中包装data.frame。您还应该设置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