给定一个字符串列表,如何计算每个字符串出现的次数?假设我有一个向量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)
我知道答案不会是这样的格式,而是类似的格式。
有很多方法可以做到这一点。在基础 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)
华泰