使用tidyr拆分字符串为行后,如何添加各部分原始顺序列?
解决方法
你可以在使用tidyr::separate_longer_delim拆分完成后,通过分组生成组内行号的方式添加记录原始顺序的order列,具体实现如下:
首先准备示例数据:
library(tidyr) library(dplyr) df <- tibble(V1 = c(1, 2), V2 = c("h,e", "l,l,o"))
然后执行拆分并添加顺序列:
df %>% separate_longer_delim(V2, delim = ",") %>% group_by(V1) %>% mutate(order = row_number()) %>% ungroup()
执行后就能得到目标结果:
| V1 | V2 | order |
|---|---|---|
| 1 | h | 1 |
| 1 | e | 2 |
| 2 | l | 1 |
| 2 | l | 2 |
| 2 | o | 3 |
原理很直接:separate_longer_delim会严格按照原始字符串中元素的顺序拆分,所以在每个V1分组内,row_number()生成的序号正好对应拆分前元素的原始位置。
如果你偏好先拆分宽格式再转长的方式,也可以用下面的代码:
df %>% separate_wider_delim(V2, delim = ",", names_sep = "_") %>% pivot_longer(cols = starts_with("V2_"), names_to = "order", values_to = "V2", names_prefix = "V2_") %>% mutate(order = as.integer(order)) %>% arrange(V1, order)
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

