假设我的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。
但是我提出的想法非常复杂,而且没有用。
是否有更好/更简便的方法?
答案 0 :(得分:2)
使用tidyr
库,可以将separate_rows
与pivot_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"
)