Чтобы упростить эту проблему, я буду использовать очень простое подмножество того, как может выглядеть набор данных:
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
просто содержит случайные числа, которые не имеют значения в этом примере, но считайте их своего рода идентификационным номером, если это поможет).
В этом примере я хотел бы:
val
(поскольку это единственные строки, которые нужно изменить)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
Как раз то, что я ищу, спасибо, не знал, что решение настолько простое
Я считаю, что это stackoverflow.com/questions/13773770/… если у вас нет дополнительных сложностей для решения.