我有一个与此类似的列表:
yellow, green, blue, yellow,...
有30个不同的关卡。但是,列表中没有显示级别。
我想创建一个这样的数据框:
yellow green blue orange
1 0 0 0
0 1 0 0
0 0 1 0
1 0 0 0
请注意,即使颜色未显示在列表中,也会有一个名为orange的列。
我尝试使用reshape2包中的dcast,melt和其他功能。 此外,我确定应该有一个问题的答案,但我找不到它(可能我没有使用谷歌最好的关键字)。
由于
编辑:更改了数据的形状和说明。
答案 0 :(得分:4)
一个简单的table
应该在基础R中执行此操作:
table(rownames(mydf), mydf$RESULT)
##
## blue green yellow
## 1 0 0 1
## 2 0 1 0
## 3 1 0 0
## 4 0 0 1
其他替代方案:
model.matrix(~RESULT + 0, mydf)
## RESULTblue RESULTgreen RESULTyellow
## 1 0 0 1
## 2 0 1 0
## 3 1 0 0
## 4 0 0 1
## attr(,"assign")
## [1] 1 1 1
## attr(,"contrasts")
## attr(,"contrasts")$RESULT
## [1] "contr.treatment"
##
或
library(reshape2)
dcast(mydf, rownames(mydf) + RESULT ~ RESULT, fun.aggregate = length,
value.var = "RESULT")
## rownames(mydf) RESULT blue green yellow
## 1 1 yellow 0 0 1
## 2 2 green 0 1 0
## 3 3 blue 1 0 0
## 4 4 yellow 0 0 1
对于简单的矢量,只需尝试:
table(1:length(yourVec), yourVec)
或
model.matrix(~ vec + 0)
使用levels
中的factor
参数在之前修改向量,使用这些方法之一来确保捕获可能不在集合中的任何值但是你想要的输出(例如"橙")。