Создайте длинный формат данных на основе строк последовательностей, определяемых двоеточиями и конкатенированными векторами.

У меня есть данные, в которых идентификаторы каждого наблюдения представляют собой числа, хранящиеся в виде последовательностей, обычно в виде 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

Каков самый простой способ его достижения?


person G_T    schedule 20.04.2017    source источник
comment
Если вы не расширяете язык, хранить код в виде строк — плохая идея. Если вам нужно сохранить более одного значения для каждого наблюдения, используйте столбец списка.   -  person alistaire    schedule 20.04.2017
comment
Я согласен. Этот формат данных исходит из пакета биоинформатики стороннего производителя. Я мог бы сделать предложение по их репозиторию github.   -  person G_T    schedule 20.04.2017


Ответы (1)


Мы можем использовать tidyverse

library(tidyverse)
example %>%
    group_by(x) %>%
    mutate(z = list(eval(parse(text=z)))) %>%
    unnest
#      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
person akrun    schedule 20.04.2017