基于由冒号和串联向量定义的序列字符串创建长数据格式
Create long data format based on strings of sequences defined by colons and concatenated vectors
我有数据,其中每个观察的 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
实现它的最简单方法是什么?
我们可以使用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
我有数据,其中每个观察的 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
实现它的最简单方法是什么?
我们可以使用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