R在列中拆分值

时间:2014-07-07 03:59:54

标签: r

我有这个数据框

 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

谢谢!

3 个答案:

答案 0 :(得分:5)

以下是一些需要考虑的选项:

  1. 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
    
  2. 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
    
  3. 来自" reshape2"的
  4. 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
    
  5. 请注意,前两个选项与第三个选项之间存在差异。如果列" 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