为了简化这个问题,我将使用数据集的一个非常基本的子集:
library(dplyr)
DF <- tibble(id = seq(1:4),
label = c("A", "B", "C", "D"),
val = c(NA, "5, 10", "20", "6, 7, 8"))
DF
# A tibble: 4 × 3
# id label val
# <int> <chr> <chr>
# 1 1 A NA
# 2 2 B 5, 10
# 3 3 C 20
# 4 4 D 6, 7, 8
注意:val
只是包含在本例中没有意义的随机数,但如果有帮助,可以将它们视为一种ID号)。
在这个例子中,我想:
- 标识
val
列中包含逗号的行(因为只有这些行需要更改) - 将每一行重复n次,使唯一改变的值在
val
列中并由单个数值组成(其中n是逗号分隔值的数量) - 。
到目前为止,我只计算出下面的过滤器步骤:
DF %>% filter(val %>% stringr::str_detect(pattern = "[,]") == TRUE)
但我不确定如何从这里开始。
这是我想要的输出:
# id label val
# <int> <chr> <chr>
# 1 1 A NA
# 2 2 B 5
# 3 2 B 10
# 4 3 C 20
# 5 4 D 6
# 6 4 D 7
# 7 4 D 8
任何帮助都是感激的,但我更喜欢避免任何循环。
谢谢:)
正如在评论中粘贴的链接中找到的答案所解释的那样,有几种方法可以解决这个问题。
最有效的方法可能是:
separate_rows(DF, val, sep = ", ")
你:
# A tibble: 7 × 3
id label val
<int> <chr> <chr>
1 1 A NA
2 2 B 5
3 2 B 10
4 3 C 20
5 4 D 6
6 4 D 7
7 4 D 8