在使用列表列进行索引时跨多个列进行变异

问题描述 投票:0回答:1

我正在尝试计算多个列

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 dplyr purrr
1个回答
0
投票

在基础R中,你可以尝试

custome_mean <- \(col) sapply(df$k, \(i) mean(df[[col]][i]))
df$v1_mean <- custome_mean("v1")
df$v2_mean <- custome_mean("v2")

如果您只想将该方法应用于几列。

© www.soinside.com 2019 - 2024. All rights reserved.