从列联表到R中的data.frame

从列联表到R中的data.frame,r,dataframe,contingency,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

我的出发点是让几个字符向量包含我从文本中提取的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.matrixtablePOS_向量时,会发生错误

Error in seq_len(ncols) : 
argument must be coercible to non-negative integer
使用as.data.frame.matrixftablePOS_向量实际上会生成一个data.frame,但没有colname

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

非常感谢您的帮助

这可能是一个解决办法,但这可能是一个解决方案

我们假设所有向量都在一个列表中:

dat <- list(c("NNS", "VBP", "JJ",  "CC",  "DT"),
c("NNS", "PRP", "JJ",  "RB",  "VB"))
我们还可以选择先将所有数据放在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)

这可能是一个解决办法,但这可能是一个解决方案

我们假设所有向量都在一个列表中:

dat <- list(c("NNS", "VBP", "JJ",  "CC",  "DT"),
c("NNS", "PRP", "JJ",  "RB",  "VB"))
我们还可以选择先将所有数据放在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)

在base 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"))

在base 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"))

非常优雅。你会考虑把这个添加到你的答案吗?非常优雅。你会考虑把这个添加到你的答案吗?谢谢你们的快速帮助,非常好!谢谢你们的快速帮助。