2016-02-05 4 views
1

Моя начальная точка имеет несколько векторов символов, содержащих теги POS, которые я извлекал из текстов. Например:Из таблиц непредвиденных обстоятельств в data.frame в R

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 

Любая помощь очень ценится.

ответ

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")) 
+0

Работало отлично! Спасибо за помощь. –

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) 

Мы можем также выбрать, чтобы положить все наши йа ta в таблице 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) 
+0

or .... 'table (rev (stack (se tNames (dat, seq_along (dat))))) '. – A5C1D2H2I1M1N2O1R2T1

+0

Очень элегантный. Не могли бы вы добавить это в свой ответ? – Heroka

+0

Выполнено ... и +1 :-) – A5C1D2H2I1M1N2O1R2T1

Смежные вопросы