基于冒号和连接向量定义的序列字符串创建长数据格式

G_T*_*G_T 6 string sequences r tidyr tidyverse

我有数据,其中每个观察的ID是作为序列存储的数字,通常以X:Y的形式,但有时是连接列表.我想整理数据,以便每个观察都有自己的行,以便我可以使用连接函数添加更多描述性ID.通常情况下,我会使用gather()函数tidyr来执行此操作,但我无法解压缩ID,因为它们是字符.

数据如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

然而,这些不起作用,并产生NA:

as.numeric("1:3")
as.integer("1:3")
as.numeric("c(7,9,10)")
as.integer("c(7,9,10)")
Run Code Online (Sandbox Code Playgroud)

必须有一个简单的方法来做到这一点,但我想一个很长的路可能是提取数字并首先将它们存储为列表.对于X:Y ID,我可以通过将字符串拆分为":",然后从一个数字到另一个数字创建一个序列,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

但是这没用.

我的目标是这样的:

# 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
Run Code Online (Sandbox Code Playgroud)

实现它的最简单方法是什么?

akr*_*run 11

我们可以用 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
Run Code Online (Sandbox Code Playgroud)