给定一个字符串列表,我如何计算每次出现的次数?说我一个矢量x
如下:计算每个字符串出现在R的次数
x <- c('cat','cat','cat','cat','dog','dog','cat','cow')
我想获得的计数为:
# cat : 5
# dog : 2
# cow : 1
我知道答案不会被格式化这样的,但类似的规定。
给定一个字符串列表,我如何计算每次出现的次数?说我一个矢量x
如下:计算每个字符串出现在R的次数
x <- c('cat','cat','cat','cat','dog','dog','cat','cow')
我想获得的计数为:
# cat : 5
# dog : 2
# cow : 1
我知道答案不会被格式化这样的,但类似的规定。
有很多方法可以做到这一点。在基础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)
which'll再次这类由ans1
,列“X”结果在data.table
中速度非常快。
system.time(setkey(ans1, x))
# user system elapsed
# 0.002 0.000 0.003
这里也为那些有兴趣在速度比较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
HTH
您可以使用'tally()'而不是'summarize(n())' – Hugh
我认为你正在寻找'表()'。 –
是这就是我正在寻找的感谢! – Marsenau