在 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
的列拆分为 list
个 vector
,然后使用 tapply
按 sum
lst1 <- strsplit(df$sample_names, ",\s+")
tapply(rep(df$sample_values, lengths(lst1)), unlist(lst1), FUN = sum)
我有一个数据框:
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
的列拆分为 list
个 vector
,然后使用 tapply
按 sum
lst1 <- strsplit(df$sample_names, ",\s+")
tapply(rep(df$sample_values, lengths(lst1)), unlist(lst1), FUN = sum)