R语言 列子集的行方向和,列名存储在另一列中

aiqt4smr  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(186)

也许题目没有说得太清楚,但我不知道如何更好地表述,于是我提出了这个问题:
我在r中使用的数据框如下所示,但要大得多:

df <- data.frame(ref = c("01","02","03","04","05"), 
                         var1 = c(2,3,6,8,5),
                         var2 = c(3,8,1,5,7),
                         var3 = c(1,1,4,5,6),
                         columns_to_sum = c("var1, var2", 
                                            "var1, var3", 
                                            "var2, var3",
                                            "var1, var2, var3",
                                            "var1"))

我想要得到的是一个新列,它是名称在该列中的列的值的总和的结果:“columns_to_sum”。因此,结果 Dataframe 将类似于:

为了以防万一,我将结果添加到下面代码行中的可重现示例中:

df <- data.frame(ref = c("01","02","03","04","05", 
                 var1 = c(2,3,6,8,5),
                 var2 = c(3,8,1,5,7),
                 var3 = c(1,1,4,5,6),
                 columns_to_sum = c("var1, var2", 
                    "var1, var3", 
                    "var2, var3",
                    "var1, var2, var3",
                    "var1"),
                 result_column = c(5,4,5,18,5)
                 )

我已经在rowSums函数中使用过dplyr::select函数几次了,例如:

df_rs <- df %>% mutate(
  result_column = rowSums(dplyr::select(., matches("var")))
  )

但是,我找不到一种方法来选择列中包含的列进行求和:“列到总和”。
你知道吗?
先谢谢你了!

wtzytmuj

wtzytmuj1#

遍历行,获取列名- strsplitsum

cbind(df, 
      result = sapply(seq(nrow(df)), function(i){
        cols <- unlist(strsplit(df$columns_to_sum[ i ], ", ", fixed = TRUE))
        sum(df[i, cols, drop = FALSE])
      }))

#   ref var1 var2 var3   columns_to_sum result
# 1  01    2    3    1       var1, var2      5
# 2  02    3    8    1       var1, var3      4
# 3  03    6    1    4       var2, var3      5
# 4  04    8    5    5 var1, var2, var3     18
# 5  05    5    7    6             var1      5
tvz2xvvm

tvz2xvvm2#

我还有个主意。

library(purrr)
library(dplyr)
df |>
    mutate(df, result_column = {
        idx <- strsplit(columns_to_sum, ", ")
        vars <- reduce(idx, union)
        (do.call(rbind,
                map(idx, ~vars %in% .x)) *
            df[vars]) |>
            rowSums()
    })

#>   ref var1 var2 var3   columns_to_sum result_column
#> 1  01    2    3    1       var1, var2             5
#> 2  02    3    8    1       var1, var3             4
#> 3  03    6    1    4       var2, var3             5
#> 4  04    8    5    5 var1, var2, var3            18
#> 5  05    5    7    6             var1             5

相关问题