计算每个字符串在 R 中出现的次数

Mar*_*nau 2 string r

给定一个字符串列表,如何计算每个字符串出现的次数?假设我有一个向量x如下:

x <- c('cat','cat','cat','cat','dog','dog','cat','cow')
Run Code Online (Sandbox Code Playgroud)

我想得到的计数为:

# cat : 5
# dog : 2
# cow : 1
Run Code Online (Sandbox Code Playgroud)

我知道答案不会是这样的格式,而是类似的格式。

Aru*_*run 5

有很多方法可以做到这一点。在基础 R 中,这可以使用table()(如评论中所述)来完成,也如下所示:

set.seed(1L)
x <- sample(paste0("V", 1:10), 1e3, TRUE)

table(x)
# x
#  V1 V10  V2  V3  V4  V5  V6  V7  V8  V9 
#  96 110 104  93 112 115  86  90 106  88 
Run Code Online (Sandbox Code Playgroud)

然而,这里有两件事:1)它根据输入字符串自动对结果进行排序,这可能并不总是理想的。2)如果你有一个大向量和/或寻求速度,那么它可能不是正确的选择,因为它似乎无法很好地扩展。

这是第(2)点的一个例子:

set.seed(1L)
x <- sample(paste0("V", 1:1e4), 1e8, TRUE)
system.time(table(x))
#   user  system elapsed 
# 26.899   6.827  36.826 
Run Code Online (Sandbox Code Playgroud)

data.table包在提供计数的同时保留输入顺序,同时速度非常快。这是使用以下命令在同一向量上的运行时间data.table

require(data.table)     ## >= 1.9.0
dt <- setDT(list(x=x))  ## create a data.table

system.time(ans1 <- dt[, .N, by=x]) ## get counts
#  user  system elapsed 
# 4.795   0.979   5.839
Run Code Online (Sandbox Code Playgroud)

如果您确实想获得排序后的结果,您可以这样做:setkey(ans1, x)这将按 'x' 列对结果进行排序ans1,这在 中又非常快data.table

system.time(setkey(ans1, x))
#  user  system elapsed 
# 0.002   0.000   0.003 
Run Code Online (Sandbox Code Playgroud)

对于感兴趣的人来说,这里还对速度进行了比较dplyr-data.frame请注意,这不会保留输入顺序(默认排序),就像table()从基础开始一样。

require(dplyr)                  ## Commit 1362 from github
df <- tbl_df(as.data.frame(dt)) ## get tbl_df object

system.time(ans2 <- df %.% group_by(x) %.% summarise(n()))
#   user  system elapsed 
# 15.983   1.318  17.807 
Run Code Online (Sandbox Code Playgroud)

华泰