我正在尝试使用apply函数(而不是循环)在R中构建列表列表,但是我无法将工作循环转换为lapply格式。让我多解释一下情况:
我在R(getDetails
)中有一个函数,该函数检索与传递给函数的参数相关的详细信息,并将结果返回到列表中。如果我将其传递给单个记录,则该函数运行良好,并且还构建了一个循环,该循环允许我一次遍历一个数据行一行,并将该数据帧的元素逐行传递给我函数,该函数又将列表返回到我的列表列表(detailsList[[i]]
)的第i个元素。我试图弄清楚如何将for循环转换为apply函数。你能帮我吗?我创建了一个玩具示例,如果可以工作,可以将其推广到实际的getDetails
函数中。
#use cars dataset for an example
data(cars)
#get number of rows
numrows<-dim(cars)[1]
#initialize empty list
detailsList<-vector("list", numrows)
#This is a toy example of the loop I want to convert to an apply
#I'm having trouble because this builds up a list and returns the results
#to my detailsList one element at a time and I'm not sure how to do this
#in an apply.
for (i in 1:numrows){
detailsList[[i]]<-getDetails(cars[i,])
}
detailsList
getDetails<-function(parameters){
valueA<-parameters[1]+45
valueB<-parameters[1]+10
list(valueA, valueB)
}
更新:
我以为我只是想通了这一点,但似乎当我这样做时,我在列表中得到了第三维,所以当我使用它时:
allDetails <- lapply(1:numrows, function(i) getDetails(cars[i,]))
第一个列表的第二个元素只能用allDetails[[1]][[1]][2]
访问,而不是我希望的allDetails[[1]][2]
访问。有人知道我在做什么错吗?
答案 0 :(得分:1)
我想我是在@Parfait的一点帮助下才想到的(谢谢@Parfait!)。万一其他人在寻找答案,这对我有用,但是我欢迎其他答案:
lapply(1:numrows, function(i) getDetails(cars[i,]))
并且我不得不修改函数以返回向量而不是列表:
getDetails<-function(parameters){
valueA<-parameters[1]+45
valueB<-parameters[1]+10
c(valueA, valueB)
}
答案 1 :(得分:1)
这是用vapply
out <- vapply(1:nrow(cars),
function (i) {
valA <- .subset2(cars, 1)[i] + 45L
valB <- .subset2(cars, 1)[i] + 10L
c(valA, valB)
}, numeric(2))
t(out)
# [,1] [,2]
# [1,] 49 14
# [2,] 49 14
# [3,] 52 17
# [4,] 52 17
# [5,] 53 18
# [6,] 54 19
# [7,] 55 20
# ...
# (returns an array instead of a list, but that can be changed easily).
顺便说一句,我不知道您的最终目标是什么,但是就本例而言,为什么任何循环?
# vectorized
cbind(.subset2(cars, 1) + 45L, .subset2(cars, 1) + 10L)
# [,1] [,2]
# [1,] 49 14
# [2,] 49 14
# [3,] 52 17
# [4,] 52 17
# [5,] 53 18
# [6,] 54 19
# [7,] 55 20
# ...
# or similar result with
# getDetails(cars) (version with c())