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

时间:2014-04-01 23:37:16

标签: string r

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

x <- c('cat','cat','cat','cat','dog','dog','cat','cow')

我希望得到的计数为:

# cat : 5
# dog : 2
# cow : 1

我知道答案不会像这样格式化,而是按照这些方式进行。

2 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点。在基数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 

但是,这里有两件事: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 

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

如果您确实希望获得已排序的结果,您可以执行:setkey(ans1, x),它会根据ans1中的列'x'对结果进行排序,这在{{{ 1}}。

data.table

对于那些感兴趣的人来说,这也是速度与system.time(setkey(ans1, x)) # user system elapsed # 0.002 0.000 0.003 的{​​{1}}方法的比较 - 请注意,这不会保留输入顺序(默认情况下排序),例如来自基座的dplyr同样。

data.frame

HTH

答案 1 :(得分:0)

library("plyr")
count(x)

输出:

  x  freq
 cat    5
 cow    1
 dog    2