首页 > 解决方案 > R dplyr 相对于其他列改变列

问题描述

我有一个数据框:

df <- data.frame(x = 1:5, y = rep(1,5), z = 0:4, 
                 fx = NA_real_, fy = NA_real_, fz = NA_real_)
my_count_columns <- c("x", "y", "z")

我想通过在适当的列fx,中进行变异来填充信息fyfz这表示每个计数变量的频率。

假设我不提前知道列名,在 dplyr/tidyverse 中执行此操作的最干净的方法是什么?

预期输出:

  x y z         fx  fy  fz
1 1 1 0 0.06666667 0.2 0.0
2 2 1 1 0.13333333 0.2 0.1
3 3 1 2 0.20000000 0.2 0.2
4 4 1 3 0.26666667 0.2 0.3
5 5 1 4 0.33333333 0.2 0.4

标签: rdplyr

解决方案


base R,这可能是

df[paste0('f', my_count_columns)] <- lapply(my_count_columns, 
   function(x) sapply(df[[x]], function(y) 
       mean(y == df[setdiff(my_count_columns, x)])))

或在tidyverse

library(dplyr)
library(purrr)
df %>%
    select(all_of(my_count_columns)) %>% 
    mutate(across(everything(), ~  map_dbl(., function(x)
      mean(x == df[setdiff(my_count_columns, cur_column())])), 
          .names = 'f{.col}'))

推荐阅读