我有一个像这样的R data.table
:
> old_table
id values
1: 1 A,B,C
2: 2 D,E
3: 3 F
4: 4 G,H,I,J
我想通过逗号(,)分割值列来扩展表,如下所示:
> new_table
id value
1: 1 A
2: 1 B
3: 1 C
4: 2 D
5: 2 E
6: 3 F
7: 4 G
7: 4 H
7: 4 I
7: 4 J
有一种简单的方法吗?
答案 0 :(得分:1)
我认为
new_table <- old_table[, .(value=strsplit(values, ',')[[1]]), id]
给予你之后的感受。虽然根据实际数据类型的含义,我有可能犯错误。&#34;值&#34;在old_table
。以下是我如何设置
old_table <- data.table(id=1:4,
values=c('A,B,C',
'D,E',
'F',
'G,H,I,J'))
new_table <- old_table[, .(value=strsplit(values, ',')[[1]]), id]
此输出
id value
1: 1 A
2: 1 B
3: 1 C
4: 2 D
5: 2 E
6: 3 F
7: 4 G
8: 4 H
9: 4 I
10: 4 J
答案 1 :(得分:0)
这是使用tidyverse
工具separate
和gather
执行此操作的方法。您需要检查values
列中包含的最长逗号分隔组,并在into
separate
参数中留下足够的变量名称。
library(tidyverse)
old_table <- tibble(
id = as.integer(c(1, 2, 3, 4)),
values = c("A,B,C", "D,E", "F", "G,H,I,J")
)
max_commas <- max(str_count(old_table$values, ","))
old_table %>%
separate(values, into = c("v1", "v2", "v3", "v4"), sep = ",") %>%
gather(key = "key", value = "value", starts_with("v"), na.rm = TRUE) %>%
select(-key) %>%
arrange(value)
#> Warning: Too few values at 3 locations: 1, 2, 3
#> # A tibble: 10 x 2
#> id value
#> <int> <chr>
#> 1 1 A
#> 2 1 B
#> 3 1 C
#> 4 2 D
#> 5 2 E
#> 6 3 F
#> 7 4 G
#> 8 4 H
#> 9 4 I
#> 10 4 J