我有以下数据集:
mydata<- data.frame(Factors= c("a,b" , "c,d" , "a,c"), Valu = c ("2,3" , "7,8" , "9,1"))
Factors Valu
1 a,b 2,3
2 c,d 7,8
3 a,c 9,1
Run Code Online (Sandbox Code Playgroud)
我希望转换为具有以下因素的所有值的以下内容:
a b c d
2 2 7 7
3 3 8 8
9 9
1 1
Run Code Online (Sandbox Code Playgroud)
我需要一个数据透视表.但是我需要准备数据然后使用melt并dcast获得我想要的输出:准备数据的失败尝试之一是:
mydata2 <- cSplit(mydata, c("Factors","Valu") , ",", "long")
Run Code Online (Sandbox Code Playgroud)
但他们失去了联系.
这是一个单行代码 cSplit
library(splitstackshape)
with(cSplit(cSplit(mydata, 1, ",", "long"), 2, ",", "long"), split(Valu, Factors))
#$a
#[1] 2 3 9 1
#$b
#[1] 2 3
#$c
#[1] 7 8 9 1
#$d
#[1] 7 8
Run Code Online (Sandbox Code Playgroud)
如果我们需要a data.table/data.frame,请使用dcast将'long'格式转换为'wide'.
dcast(cSplit(cSplit(mydata, 1, ",", "long"), 2, ",", "long"),
rowid(Factors)~Factors, value.var="Valu")[, Factors := NULL][]
# a b c d
#1: 2 2 7 7
#2: 3 3 8 8
#3: 9 NA 9 NA
#4: 1 NA 1 NA
Run Code Online (Sandbox Code Playgroud)
注意:splitstackshape加载data.table.在这里,我们使用了data.table_1.10.0.在dcast从data.table也非常快