1

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

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

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

 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

非常感谢任何帮助。

4

2 回答 2

3

在基础 R 中,您可以尝试:

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

您也可以使用mtabulate“qdapTools”:

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"))
于 2016-02-05T11:37:26.050 回答
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)
于 2016-02-05T11:32:01.627 回答