2014-12-31 56 views
1

我仍在学习R中的数据管理。我知道我非常接近,但无法获得准确的语法。我曾看过 count a variable by using a condition in RConditional count and group by in R 但不能完全转化为我的工作。我试图计算ST的等于0的dist.km数。最终,我会想要添加具有各种距离范围计数的列,但应该能够在获取后获取它。决赛桌应该有所有状态和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)) 

回答

3

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

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,您将只将分组列和任何在summarise内计算出的数据压缩为每组1行。如果你只是想添加一个列的计数,你可以像我在我的答案中一样使用mutate。


如果你只在积极计数兴趣的话,也可以一起使用dplyr的count功能与filter到第一子集中的数据:

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

谢谢。是的,我更喜欢使用dplyr。所有的答案(@docendo和@Ananda)都很棒。我有兴趣保留任何最终为0的计数,所以我可能会使用聚合或表。聚合选项似乎运行速度最慢。 – tjr

+0

我答案中的前两个选项也会返回0计数的ST,并且速度应该很快。 –

3

我希望我不是失去了一些东西,但它听起来像是你只是想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] 
+0

刚一说明,您dplyr和数据。表的方法 - 就像我的dplyr :: count一样 - 将删除任何'ST's的0计数dist.km == 0,而我认为他们想保留所有这些(“最终表应该有所有状态和一个计数为0“)。表和聚合当然会这样做。 –

+0

@docendodiscimus,是的。在像这样的情况下,如果他们分享期望的输出或他们打算如何使用它(因为这些对于所提出的建议有时会产生影响)总是很好的。 – A5C1D2H2I1M1N2O1R2T1

+0

这是非常真实的 –