我有这个数据框
d f
"first tweet" A
"second tweet" B
"thrid tweet" C
我想得到这个
d A B C
"first tweet" 1 0 0
"second tweet" 0 1 0
"thrid tweet" 0 0 1
谢谢!
答案 0 :(得分:5)
以下是一些需要考虑的选项:
model.matrix
cbind(mydf, model.matrix(~ 0 + f, data = mydf))
# d f fA fB fC
# 1 first tweet A 1 0 0
# 2 second tweet B 0 1 0
# 3 thrid tweet C 0 0 1
table
cbind(mydf, as.data.frame.matrix(table(sequence(nrow(mydf)), mydf$f)))
# d f A B C
# 1 first tweet A 1 0 0
# 2 second tweet B 0 1 0
# 3 thrid tweet C 0 0 1
dcast
library(reshape2)
dcast(mydf, d ~ f, value.var="f", fun.aggregate=length)
# d A B C
# 1 first tweet 1 0 0
# 2 second tweet 0 1 0
# 3 thrid tweet 0 0 1
请注意,前两个选项与第三个选项之间存在差异。如果列" d"重复出现值,则第三个选项将折叠(并制表)值,而前两个选项将逐行拆分值。
答案 1 :(得分:1)
另一种可能性:
library(qdap)
mtabulate(split(dat[[2]], dat[[1]]))
## A B C
## first tweet 1 0 0
## second tweet 0 1 0
## thrid tweet 0 0 1
答案 2 :(得分:1)
一个非常简单的表似乎可以解决这个问题。
> d <- data.frame(d = c("first tweet", "second tweet", "third tweet"),
f = c("A", "B", "C"))
> tab <- table(d)
> data.frame(d = rownames(tab), tab[,1:3], row.names = NULL)
# d A B C
# 1 first tweet 1 0 0
# 2 second tweet 0 1 0
# 3 third tweet 0 0 1