У меня есть данные, в которых идентификаторы каждого наблюдения представляют собой числа, хранящиеся в виде последовательностей, обычно в виде X: Y, но иногда в виде объединенных списков. Я хотел бы привести данные в порядок, чтобы каждое наблюдение имело свою собственную строку, чтобы затем я мог использовать функцию соединения для добавления более описательных идентификаторов. Обычно я бы использовал для этого функцию gather()
из tidyr
, но у меня возникли проблемы с распаковкой идентификаторов, поскольку они являются символами.
Данные выглядят так:
example <- data_frame(x = LETTERS[1:3], y = c("Condition 1", "Condition 2", "Condition 3"), z = c("1:3", "4:6", "c(7,9,10)"))
example
# A tibble: 3 × 3
x y z
<chr> <chr> <chr>
1 A Condition 1 1:3
2 B Condition 2 4:6
3 C Condition 3 c(7,9,10)
Однако они не работают, и все производят NA
:
as.numeric("1:3")
as.integer("1:3")
as.numeric("c(7,9,10)")
as.integer("c(7,9,10)")
Должен быть простой способ сделать это, но я подумал, что один длинный путь может состоять в том, чтобы сначала извлечь числа и сохранить их в виде списка. Для идентификаторов X: Y я мог бы сделать это, разделив строку на «:», а затем создав последовательность от одного числа к другому, например:
example[1:2,] %>%
+ separate(z, c("a", "b"), sep = ":") %>%
+ mutate(a = as.numeric(a), b = as.numeric(b), new = list(seq(a, b)))
Error in eval(expr, envir, enclos) : 'from' must be of length 1
Однако это не сработало.
То, к чему я стремлюсь, выглядит так:
# A tibble: 9 × 3
x y z
<chr> <chr> <dbl>
1 A Condition 1 1
2 A Condition 1 2
3 A Condition 1 3
4 B Condition 2 4
5 B Condition 2 5
6 B Condition 2 6
7 C Condition 3 7
8 C Condition 3 9
9 C Condition 3 10
Каков самый простой способ его достижения?