在R中如何将含逗号分隔值的CSV数据整理为三列格式?
问题描述
我继承了一个数据集,其中个体大小数据以逗号分隔值的形式存储在单元格中,原始数据格式如下:
| Date | Species1 | Species2 |
|---|---|---|
| 073022 | 22,44 | 88,84,84 |
| 072822 | 35,67,19 | 78,73 |
需要提取这些大小数据并保留元数据,转换为如下三列格式:
| Date | Species | Size |
|---|---|---|
| 073022 | Species1 | 22 |
| 073022 | Species1 | 44 |
| 073022 | Species2 | 88 |
| 073022 | Species2 | 84 |
| ... | ... | ... |
已知可能用到strsplit、unnest或separate函数,但不清楚如何应用,求实现方法。
解决方案(R语言)
用tidyverse工具链可以轻松实现,下面提供两种常用方法:
方法一:分步拆分+展开
library(tidyverse) # 模拟原始数据 original_data <- tibble( Date = c("073022", "072822"), Species1 = c("22,44", "35,67,19"), Species2 = c("88,84,84", "78,73") ) tidy_data <- original_data %>% # 宽表转长表,提取物种名称和对应大小字符串 pivot_longer(cols = starts_with("Species"), names_to = "Species", values_to = "Size_str") %>% # 拆分逗号分隔的字符串为列表 mutate(Size = str_split(Size_str, ",")) %>% # 展开列表为多行 unnest(Size) %>% # 可选:将Size转为数值类型,方便后续分析 mutate(Size = as.integer(Size)) %>% # 移除临时列 select(-Size_str) print(tidy_data)
关键函数解释
pivot_longer():把原表中Species1、Species2这类列,转换为Species(存储物种名)和Size_str(存储逗号分隔的大小字符串)两列。str_split():将每个Size_str按逗号拆分,生成字符列表(比如"22,44"会变成c("22", "44"))。unnest():把列表类型的Size列展开,每个列表元素对应一行,同时保留Date和Species的元数据。
方法二:用separate_rows一步到位
separate_rows()可以直接将逗号分隔的字符串拆分成多行,代码更简洁:
library(tidyverse) tidy_data <- original_data %>% pivot_longer(cols = starts_with("Species"), names_to = "Species", values_to = "Size") %>% separate_rows(Size, sep = ",") %>% mutate(Size = as.integer(Size)) print(tidy_data)
这个方法里,separate_rows()替代了str_split()+unnest()的组合,直接完成拆分和行展开的操作。
内容的提问来源于stack exchange,提问作者jrmetzge
相关产品推荐
相关产品推荐

