我正在尝试计算多个列
v1
和 v2
的平均值,同时对另一个列表列 k
中包含的索引进行子集化。这是一个玩具示例。
library(dplyr)
set.seed(1452)
df <- tibble(id = 1:10,
v1 = rnorm(10, 3, 10),
v2 = runif(10, -5, 5),
k = list(c(1,2,3), c(2,4,10), c(2,4,6), c(6,8,9),
c(3,5,7), c(1,8,10), c(2,3,5), c(1,4,9),
c(6,7,10), c(3,6,8))
)
df %>%
mutate(across(v1:v2, ~mean(.x[k]), .names = "{.col}_mean"))
因此,例如,我需要
v1_mean
列的第一个值是第 1、2 和 3 行的 v1
的平均值。因为 k
是列表列,所以我还尝试集成 map
类型命令从purrr
内部across()
,但没有成功。
在基础R中,你可以尝试
custome_mean <- \(col) sapply(df$k, \(i) mean(df[[col]][i]))
df$v1_mean <- custome_mean("v1")
df$v2_mean <- custome_mean("v2")
如果您只想将该方法应用于几列。