我的出发点是有几个包含从文本中提取的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
非常感谢任何帮助。
答案 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)