R语言tidyverse下单列多分隔数据转长格式的简洁实现方案求教
你可以使用tidyverse生态中专门处理这类拆分场景的函数实现更简洁的写法,两种常用方案如下:
方案1:tidyr 1.3.0+ 推荐写法
用separate_longer_delim()直接完成分隔符拆分转行,仅需3步即可匹配你需要的输出:
library(tidyverse) df %>% # 按分号拆分data列,每个元素单独占一行 separate_longer_delim(data, delim = ";") %>% # 重命名拆分后的结果列为value rename(value = data) %>% # 按id分组生成每个元素的序号 group_by(id) %>% mutate(data_number = as.character(row_number())) %>% ungroup()
方案2:兼容旧版本tidyr的写法
如果你的tidyr版本低于1.3.0,用字符串拆分+列表展开的组合实现:
df %>% # 将data列的字符串按分号拆分为列表 mutate(data = str_split(data, ";")) %>% # 展开列表列,同时生成元素位置序号 unnest_longer(data, indices_to = "data_number") %>% # 重命名结果列 rename(value = data)
两种方案都不需要提前预估拆分后的最大列数,也不需要额外做宽转长、过滤空值的操作,代码可读性和运行效率都更高。
内容的提问来源于stack exchange,提问作者Alexlok
相关产品推荐
相关产品推荐

