R语言:拆分多分类行并累加对应计数的实现求助
解决方案
方法一:使用tidyverse工具包(推荐,代码简洁易读)
先构造原始数据:
df <- data.frame( value1 = c("apple", "orange", "banana", "apple,orange"), count = c(2, 4, 6, 2), stringsAsFactors = FALSE )
用separate_rows拆分逗号分隔的条目,再分组求和:
library(tidyverse) df_processed <- df %>% # 按逗号拆分value1,将单行拆为多行 separate_rows(value1, sep = ",") %>% # 按value1分组 group_by(value1) %>% # 对每组的count求和 summarize(count = sum(count)) %>% ungroup()
运行后得到目标结果:
> df_processed # A tibble: 3 × 2 value1 count <chr> <dbl> 1 apple 3 2 banana 6 3 orange 5
方法二:Base R实现(无需额外安装包)
先构造原始数据,再通过拆分、扩展数据框后聚合:
df <- data.frame( value1 = c("apple", "orange", "banana", "apple,orange"), count = c(2, 4, 6, 2), stringsAsFactors = FALSE ) # 拆分每个value1为字符向量 split_values <- strsplit(df$value1, ",") # 生成对应长度的count向量(拆分后每个元素复用原行的count) expanded_counts <- rep(df$count, sapply(split_values, length)) # 展开拆分后的value1 expanded_values <- unlist(split_values) # 聚合求和得到结果 df_processed <- aggregate( count ~ value1, data = data.frame(value1 = expanded_values, count = expanded_counts), FUN = sum )
你原有代码的问题
直接执行df$value1 <- unlist(strsplit(as.character(df$value1), ","))会报错——原数据框是4行,但拆分后得到5个元素,长度不匹配无法直接赋值。正确思路是先把数据框扩展为拆分后的多行结构,再分组求和,而非直接替换原列。
内容的提问来源于stack exchange,提问作者Becky
相关产品推荐
相关产品推荐

