2016-05-31 3 views
0

Я хотел бы разделить некоторые данные в кадре данных на определенную строку и подсчитать частоту.R lapply using stringi и rbind

После того, как я использовал несколько методов, я придумал метод, но в моих результатах есть небольшая ошибка.

Пример:

данных файла данных кадра:

data 
abc hello 
hello 
aaa 
zxy 
xyz 

Список:

list 
abc 
bcd 
efg 
aaa 

Мой код:

lapply(list$list, function(x){ 
    t <- data.frame(words = stri_extract(df$data, coll=x)) 
    t<- setDT(t)[, .(Count = .N), by = words] 
    t<-t[complete.cases(t$words)] 
    result<-rbind(result,t) 
    write.csv(result, "new.csv", row.names = F) 
}) 

В этом примере я бы ожидать CSV фи ле со следующими результатами:

words Count 
abc  1 
aaa  1 

Однако с моим кодом я получил:

words Count 
aaa  1 

Я знаю stri_extract должен определить abc в abc hello поэтому, возможно, ошибка происходит, когда я использую rbind?

+0

Смотрите также: 'STRINGI :: stri_list2matrix' – gagolews

ответ

3

Вам необходимо переместить файл write.csv из цикла, иначе он переопределит ранее сохраненный файл, и вы сохраните файл только на завершающем этапе. Поступая таким образом, вы получите rbind ваш результат за пределами lapply, так как вы не можете изменить переменную result в функции.

result <- do.call(rbind, lapply(list$list, function(x){ 
           t <- data.frame(words = stri_extract(df$data, coll=x)) 
           t<- setDT(t)[, .(Count = .N), by = words] 
           t<-t[complete.cases(t$words)] 
           t 
})) 

write.csv(result, "new.csv", row.names = F) 
+0

Спасибо, очень полезно –

+0

Не могли вы write.csv в цикле с Append = T? Это, вероятно, просто замедлит процесс в любом случае, мне нужно только написать один раз, просто спрашивая –

+0

Это тоже жизнеспособное решение. Вы можете пойти и попробовать. Не уверен в производительности. – Psidom

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