首页 > 解决方案 > 用 R 中的 data.table 计算字数

问题描述

我是 data.table 的新手,我有一个包含人名和国家/地区的数据集,我想按国家/地区了解最常见的名称。

数据集如下所示:

DT <- data.table(person_id = c(1,2,3,4,5,6),
           person_name = c('John Smith', 'Marty Mcfly', 'Amélie Poulain', 'John Wick', 'Clark Kent', 'Marcel Poulain'),
           person_ctry = c('US', 'US', 'FR', 'US', 'US', 'FR')
           )

我想获得这样的data.table:

person_ctry word     count
US          John     2
US          Smith    1
US          Marty    1
FR          Poulain  2
FR          Amélie   1
....

我试过这个:

all_names <- DT[, lapply(.(person_name), paste0, collapse=" "), by=person_ctry]

wordcount <- function(str) {
  as.data.frame(table(unlist( strsplit(str, "\ ") )))
}
all_names[, c("word","count") := wordcount(V1), by=person_ctry]

但是最后一行给出了一个错误,说 RHS 与 LHS 长度不完全匹配。但是,我不知道如何纠正它。有任何想法吗 ?

谢谢。

标签: rdata.table

解决方案


这是一个稍微修改的方法来计算这些单词:

DT[, .(word = unlist(strsplit(person_name, '\\s+'), use.names = FALSE)), 
   by = .(person_ctry)][, .(count = .N), by = .(person_ctry, word)]

 #     person_ctry    word count
 #  1:          US    John     2
 #  2:          US   Smith     1
 #  3:          US   Marty     1
 #  4:          US   Mcfly     1
 #  5:          US    Wick     1
 #  6:          US   Clark     1
 #  7:          US    Kent     1
 #  8:          FR  Amélie     1
 #  9:          FR Poulain     2
 # 10:          FR  Marcel     1

该方法有两个步骤:

  • 在空格处拆分单词(名称),按国家/地区执行此操作以创建中间 data.table
  • .N使用 data.tables 特殊功能计算每个国家/地区每个唯一单词的行数

我使用一个链结合了这两个步骤[]


推荐阅读