R-像Excel这样的乡村

时间:2018-08-23 05:02:02

标签: r

我有一个这样的CSV,保存为R中的对象df1。

 X Y Z Year
 0 2 4 2014
 3 1 3 2014
 5 4 0 2014
 0 3 0 2014
 2 1 0 2015

我要:

  1. 对2014年没有“ 0”的每一列进行计数。例如,对于X列,计数= 2(不是3,因为我只想要2014年数据)。对于Y列,计数为4。对于Z列,计数为1。

  2. 对每一列的所有计数求和

这是我尝试过的:

count_total <- sum(df1$x != 0 &
                   df1$y != 0 &
                   df1&z != 0 &
                   df1$Year == 2014)
count_total

我希望输出仅是1(即df中的第二行没有0)

但是,这与我对excel的看法不符。在excel中,就像这样:

=COUNTIFS('df1'!$A$2:$A$859,"<>0",'df1'!$B$2:$B$859,"<>0",
          'df1'!$C$2:$C$859,"<>0",'df1'!$D$2:$D$859,2014)

想知道我在R上输错了什么吗?我是dyplr用户,但在Google上找不到任何特别有用的东西。

非常感谢您!

4 个答案:

答案 0 :(得分:2)

一种方法是在rowSums的数据上使用subset

sum(rowSums(subset(df1, Year == 2014) == 0) == 0)
#[1] 1

答案 1 :(得分:2)

您可以先使用aggregate然后使用colSums来按列获取总计。

agg <- aggregate(. ~ Year, df1, function(x) sum(x != 0))
agg
#  Year X Y Z
#1 2014 2 4 2
#2 2015 1 1 0

colSums(agg[-1])
#X Y Z 
#3 5 2

数据。

df1 <- read.table(text = "
X Y Z Year
 0 2 4 2014
 3 1 3 2014
 5 4 0 2014
 0 3 0 2014
 2 1 0 2015
",header = TRUE)

答案 2 :(得分:1)

替代使用summaryBy

library(doBy)
summaryBy(list(c('X','Y','Z'), c('Year')), df1, FUN= function(x) sum(x!=0), keep.names=T)

  Year X Y Z
1 2014 2 4 2
2 2015 1 1 0

如需要,请在需要时使用colSums

答案 3 :(得分:1)

dplyr方法:

library(dplyr)
df1 %>% 
  group_by(Year) %>% 
  summarise_at(vars(X:Z), function (x) sum(x != 0))

输出:

# A tibble: 2 x 4
#    Year     X     Y     Z
#   <int> <int> <int> <int>
# 1  2014     2     4     2
# 2  2015     1     1     0