2017-04-20 9 views
6

我有数据,其中每个观察的ID都是以序列形式存储的数字,通常以X:Y的形式存在,但有时会连接列表。我想整理数据,以便每个观察都有自己的行,这样我就可以使用连接函数来添加更多描述性ID。通常我会使用tidyr中的gather()函数来完成此操作,但是我无法解开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) 

然而,这些不工作,都产生NA

as.numeric("1:3") 
as.integer("1:3") 
as.numeric("c(7,9,10)") 
as.integer("c(7,9,10)") 

必须有一个简单的方法来做到这一点,但我觉得一个很长的路可能首先提取数字并将它们存储为列表。对于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 

然而,这没有奏效。

什么我的目标看起来像这样:

# 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 

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

+0

除非你扩展语言,这是一个坏主意来存储代码串。如果您需要为每个观察值存储多个值,请使用列表列。 – alistaire

+0

我同意。这种数据格式来自第三方生物信息学软件包。我可能会对他们的github回购提出建议。 –

回答

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