首页 > 解决方案 > 同时拆分两列并使用 data.table 制作长格式数据

问题描述

鉴于以下数据

d.df <- read.table(header=T, text="V1 | V2 | V3
A + C | Cat + Dog | Type 1
B + D | Bird | Type 1
A + D | Cat + Fish | Type 2" ,stringsAsFactors=F, sep="|", strip.white = TRUE)
require(data.table)
setDT(d.df)

我想使这些数据以长格式同时拆分两个变量,所以所需的输出是这样的

A Cat Type 1
C Dog Type 1
B Bird Type 1
D Bird Type 1
A Cat Type 2
D Fish Type 2

这样我可以基于一个变量进行拆分

output <- d.df[, list(V2 = unlist(str_split(V2, " \\+ "))), by = V1]

但是如果我一起尝试,我会得到一个错误recycled with remainder.

标签: rdata.table

解决方案


我们可以cSplit使用splitstackshape

splitstackshape::cSplit(d.df, c("V1", "V2"), sep = "+", direction = "long")

#   V1   V2     V3
#1:  A  Cat Type 1
#2:  C  Dog Type 1
#3:  B Bird Type 1
#4:  D Fish Type 1
#5:  A  Cat Type 2
#6:  D Fish Type 2

separate_rowsfromtidyr在这种情况下也适用

tidyr::separate_rows(d.df, V1, V2, sep = "\\s+\\+\\s+")

推荐阅读