在 R 中:是否有一种优雅的方式将 data.frame 行按“,”拆分并添加到与拆分字符串匹配的现有行中?

In R: is there an elegant way to split data.frame row by "," and add to existing rows matching the splitted strings?

我有一个数据框:

df <- data.frame(sample_names=c("foo","bar","foo, bar"), sample_values=c(1,5,3))
df

  sample_names sample_values
1          foo             1
2          bar             5
3     foo, bar             3

我想要一个如下形状的 data.frame:

  sample_names sample_values
1          foo             4
2          bar             8

有什么优雅的方法可以做到这一点吗?我的解决方法是通过“,”进行 grep,然后以某种方式将结果巧妙地添加到现有行中。由于我想将其应用于多个数据帧,因此我想提出一个更简单的解决方案。有什么想法吗?

我们可以用separate_rows拆分列,然后做一个group by操作得到sum

library(dplyr)
library(tidyr)
df %>%
   separate_rows(sample_names) %>% 
   group_by(sample_names) %>% 
   summarise(sample_values = sum(sample_values), .groups = 'drop')

-输出

# A tibble: 2 x 2
#  sample_names sample_values
#  <chr>                <dbl>
#1 bar                      8
#2 foo                      4

或使用 base R,将 strsplit 的列拆分为 listvector,然后使用 tapplysum

lst1 <- strsplit(df$sample_names, ",\s+")
tapply(rep(df$sample_values, lengths(lst1)), unlist(lst1), FUN = sum)