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)