按组统计和有条件地计数

7
我正在学习R语言中的数据管理。虽然我距离成功很近,但仍无法获得精确的语法。我已经查看了在R中使用条件计算变量在R中按条件计数和分组,但还不能将其准确地应用到我的工作中。我试图获取dist.km等于0的ST数的计数。最终,我希望添加包含各种距离范围计数的列,但在此之前应该能够获得这个计数。最终的表格应该包括所有州及其0的计数。以下是一个20行的样本。
structure(list(ST = structure(c(12L, 15L, 13L, 10L, 15L, 16L, 
11L, 12L, 8L, 14L, 10L, 14L, 6L, 11L, 5L, 5L, 15L, 1L, 6L, 4L
), .Label = c("CT", "DE", "FL", "GA", "MA", "MD", "ME", "NC", 
"NH", "NJ", "NY", "PA", "RI", "SC", "VA", "VT", "WV"), class = "factor"), 
Rfips = c(42107L, 51760L, 44001L, 34001L, 51061L, 50023L, 
36029L, 42101L, 37019L, 45079L, 34029L, 45055L, 24003L, 36027L, 
25009L, 25009L, 51760L, 9003L, 24027L, 1111L), zip = c(17972L, 
23226L, 2806L, 8330L, 20118L, 5681L, 14072L, 19115L, 28451L, 
29206L, 8741L, 29020L, 20776L, 12545L, 1922L, 1938L, 23226L, 
6089L, 21042L, 36278L), Year = c(2010L, 2005L, 2010L, 2008L, 
2007L, 2006L, 2005L, 2008L, 2009L, 2008L, 2010L, 2006L, 2007L, 
2008L, 2011L, 2011L, 2008L, 2005L, 2008L, 2009L), dist.km = c(0, 
42.4689368078209, 28.1123394088972, 36.8547005648639, 0, 
49.7276501081775, 0, 30.1937156926235, 0, 0, 31.5643658415831, 
0, 0, 0, 0, 0, 138.854136893762, 0, 79.4320981205195, 47.1692144550079
)), .Names = c("ST", "Rfips", "zip", "Year", "dist.km"), row.names = c(132931L, 
105670L, 123332L, 21361L, 51576L, 3520L, 47367L, 99962L, 18289L, 
126153L, 19321L, 83224L, 6041L, 46117L, 49294L, 48951L, 109350L, 
64465L, 80164L, 22687L), class = "data.frame")

以下是我尝试过的几段代码。

state= DDcomplete %>%
group_by(ST) %>%
summarize(zero = sum(DDcomplete$dist.km==0, na.rm = TRUE))

state= aggregate(dist.km ~ ST, function(x) sum(dist.km==0, data=DDcomplete))

state = (DDcomplete[DDcomplete$dist.km==0,], .(ST), function(x) nrow(x))
2个回答

16

如果您想将它作为一个列添加,可以执行以下操作:

DDcomplete %>% group_by(ST) %>% mutate(count = sum(dist.km == 0))

或者,如果您只想知道每个州的计数:

DDcomplete %>% group_by(ST) %>% summarise(count = sum(dist.km == 0))

实际上,你离解决方案非常接近。你的代码

state= DDcomplete %>%
    group_by(ST) %>%
    summarize(zero = sum(DDcomplete$dist.km==0, na.rm = TRUE))

基本正确。你可以从调用sum中移除DDcomplete$,因为在dplyr链中,你可以直接访问变量。

此外,需要注意的是,使用summarise将会将数据框压缩为每组1行,只包括分组列以及在summarise中计算的内容。如果你只想要添加一个包含计数的列,你可以使用我在答案中所用的mutate。


如果你只对正数感兴趣,你还可以使用dplyr的count函数和filter来先对数据进行子集操作:

filter(DDcomplete, dist.km == 0) %>% count(ST)

谢谢。是的,我更喜欢使用dplyr。所有答案(@docendo和@Ananda)都非常好用。我对保留任何计数为0的数据很感兴趣,所以我可能会使用aggregate或table。其中,aggregate选项似乎运行最慢。 - tjr
我的答案中的前两个选项也会返回计数为0的ST,并且速度应该很快。 - talat

4

我希望我没有漏掉什么,但是听起来你只是想在对一些子集进行操作后添加一个table

table(df[df$dist.km == 0, "ST"])
# 
# CT DE FL GA MA MD ME NC NH NJ NY PA RI SC VA VT WV 
#  1  0  0  0  2  1  0  1  0  0  2  1  0  2  1  0  0 

其他方法可能包括:

## dplyr, since you seem to be using it
library(dplyr)
df %>%
  filter(dist.km == 0) %>%
  group_by(ST) %>%
  summarise(n())

## aggregate, since you tried that too
aggregate(dist.km ~ ST, df, function(x) sum(x == 0))

## data.table
library(data.table)
as.data.table(df)[dist.km == 0, .N, by = ST]

只是提醒一下,你的dplyr和data.table方法 - 就像我使用dplyr::count一样 - 会删除任何dist.km == 0计数为0的“ST”,而我认为他们想要保留所有这些(“最终表应该包括所有州和0的计数。”)。当然,table和aggregate可以做到这一点。 - talat
@docendodiscimus,是的。在这种情况下,如果他们分享所需的输出或打算如何使用它(因为有时这些会对建议产生影响),那就很好了。 - A5C1D2H2I1M1N2O1R2T1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接