我有一个清单,
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?
答案 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