使用列表的内容作为向量中的索引

时间:2018-04-07 20:53:01

标签: r list lapply

我有一个清单,

p1 <- c(1,2,4)
p2 <- c(4,6,5)
p3 <- c(9,2,1)
W <- list(p1,p2,p3)

和一个矢量,

a <- c(0.2,0.1,0.7,0.8,0.8,0.8,0.4,0.5,0.9)

我想做以下事情,

v <- c(0,0,0)
for(i in 1:3)
{
  v[i] <- mean(a[W[[i]][]])
}

但没有循环。

诀窍是什么? Lapply?

3 个答案:

答案 0 :(得分:2)

你可以使用rowsum()做一点工作。这是一个非常有效的无循环解决方案。

l <- lengths(W)
rowsum(a[unlist(W)], rep(1:length(W), l)) / l
#        [,1]
# 1 0.3666667
# 2 0.8000000
# 3 0.4000000

我在此处指定l的唯一原因是避免第二次计算lengths(W)。但是lengths()也非常快,所以你也可以做一个单行

rowsum(a[unlist(W)], rep(1:length(W), lengths(W))) / lengths(W)

答案 1 :(得分:1)

这类似于你的for循环,但使用sapply来完成任务。

sapply(1:3, function(i) mean(a[W[[i]]]))
# [1] 0.3666667 0.8000000 0.4000000

我们也可以使用tapply

# Create b based on the index in the list W
index <- unlist(W)
b <- a[index]

# Calcualte the mean for every three numbers
tapply(b, rep(1:3, each = 3), mean)

#         1         2         3 
# 0.3666667 0.8000000 0.4000000 

答案 2 :(得分:1)

如果您已经在列表中放置了项目,则可以使用不带索引的应用函数。

require(purrr)
map_dbl(W, ~mean(a[.]))
# [1] 0.3666667 0.8000000 0.4000000

或没有purrr

sapply(W, function(w) mean(a[w]))
# [1] 0.3666667 0.8000000 0.4000000