将列列表拆分为列

时间:2020-10-30 09:56:20

标签: r list data.table

假设我的DT为-

['CM_30_00.v03', 'CM_30_00_house.v03', 'CM_30_01.v01']

id values valid_types 1 2|3 100|200 2 4 200 3 2|1 500|100 告诉我什么是我需要的有效类型。总共有4种类型(100、200、500、2000)。条目用valid_types分隔的字符值指定了它们的有效类型和相应的值。

我想将其转换为类型为列及其对应值的DT。

预期:

|

我认为我可以将这两列都放在id 100 200 500 1 2 3 NA 2 NA 4 NA 3 1 NA 2 上,这将给我两个列表。然后,我通过将键设置为类型列表的名称来组合它们,然后将最终列表转换为DT。

但是我提出的想法非常复杂,而且没有用。

是否有更好/更简便的方法?

2 个答案:

答案 0 :(得分:2)

使用tidyr库,可以将separate_rowspivot_wider结合使用:

library(tidyr)

df %>%
  separate_rows(values, valid_types, sep = '\\|', convert = TRUE) %>%
  pivot_wider(names_from = valid_types, values_from = values)

#     id `100` `200` `500`
#  <int> <int> <int> <int>
#1     1     2     3    NA
#2     2    NA     4    NA
#3     3     1    NA     2

一种data.table的方式是:

library(data.table)
library(splitstackshape)

setDT(df)
dcast(cSplit(df, c('values', 'valid_types'), sep = '|', direction = 'long'), 
                 id~valid_types, value.var = 'values')

答案 1 :(得分:2)

这是另一种data.table方法:

dcast(
  DT[, lapply(.SD, function(x) strsplit(x, "\\|")[[1L]]), by = id], 
  id ~ valid_types, value.var = "values"
)