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

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

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

除非您正在扩展语言,否则将代码存储为字符串是一个不好的主意。如果您需要存储每个观察值的多个值,请使用列表列。 - alistaire
我同意。这种数据格式来自第三方生物信息学软件包。我可能会在他们的Github存储库上提出建议。 - G_T
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接