给定一个字符串列表,如何计算每个字符串出现的次数?说我的矢量x
如下:
x <- c('cat','cat','cat','cat','dog','dog','cat','cow')
我希望得到的计数为:
# cat : 5
# dog : 2
# cow : 1
我知道答案不会像这样格式化,而是按照这些方式进行。
答案 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