通过拆分一列来扩展R data.table

时间:2018-02-02 22:00:32

标签: r data.table

我有一个像这样的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

有一种简单的方法吗?

2 个答案:

答案 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工具separategather执行此操作的方法。您需要检查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