2014-04-01 2495 views
0

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

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

我想获得的计数为:

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

我知道答案不会被格式化这样的,但类似的规定。

+2

我认为你正在寻找'表()'。 –

+0

是这就是我正在寻找的感谢! – Marsenau

回答

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) which'll再次这类由ans1,列“X”结果在data.table中速度非常快。

system.time(setkey(ans1, x)) 
# user system elapsed 
# 0.002 0.000 0.003 

这里也为那些有兴趣在速度比较dplyrdata.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

+0

您可以使用'tally()'而不是'summarize(n())' – Hugh

相关问题