从列联表到R中的data.frame

时间:2016-02-05 11:18:55

标签: r dataframe contingency

我的出发点是有几个包含从文本中提取的POS标签的字符向量。例如:

c("NNS", "VBP", "JJ",  "CC",  "DT")
c("NNS", "PRP", "JJ",  "RB",  "VB")

我使用table()ftable()来计算每个标记的出现次数。

 CC  DT  JJ NNS VBP 
 1   1   1   1   1

最终目标是让data.frame看起来像这样:

   NNS VBP PRP JJ CC RB DT VB
1  1   1   0   1  1  0  1  0
2  1   0   1   1  0  1  0  1 

在这里使用plyr::rbind.fill对我来说似乎很合理,但它需要data.frame对象作为输入。但是,使用as.data.frame.matrix(table(POS_vector))时会发生错误。

Error in seq_len(ncols) : 
argument must be coercible to non-negative integer

使用as.data.frame.matrix(ftable(POS_vector))实际上会生成一个data.frame,但没有colnames。

V1 V2 V3 V4 V5 ...
1  1  1  1  1

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

在基地R,您可以尝试:

table(rev(stack(setNames(dat, seq_along(dat)))))

您也可以使用“qdapTools”中的mtabulate

library(qdapTools)
mtabulate(dat)
#   CC DT JJ NNS PRP RB VB VBP
# 1  1  1  1   1   0  0  0   1
# 2  0  0  1   1   1  1  1   0

dat与@Heroka的答案中定义的相同:

dat <- list(c("NNS", "VBP", "JJ",  "CC",  "DT"),
            c("NNS", "PRP", "JJ",  "RB",  "VB"))

答案 1 :(得分:2)

这可能是一种解决方法,但这可能是一种解决方案。

我们假设我们所有的载体都在列表中:

dat <- list(c("NNS", "VBP", "JJ",  "CC",  "DT"),
c("NNS", "PRP", "JJ",  "RB",  "VB"))

然后我们将表转换为转置矩阵,我们将其转换为data.table:

library(data.table)
temp <- lapply(dat,function(x){
  data.table(t(as.matrix(table(x))))
})

然后我们使用rbindlist创建所需的输出:

rbindlist(temp,fill=T)

我们也可以先选择将所有数据放入data.table,然后再进行聚合。请注意,这假设矢量长度相等。

temp <- as.data.table(dat)
#turn to long format
temp_m <- melt(temp, measure.vars=colnames(temp))

#count values for each variable/value-combination, then reshape to wide
res <- dcast(temp_m[,.N,by=.(variable,value)], variable~value,value.var="N", fill=0)