我有一个这样的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
我要:
对2014年没有“ 0”的每一列进行计数。例如,对于X列,计数= 2(不是3,因为我只想要2014年数据)。对于Y列,计数为4。对于Z列,计数为1。
对每一列的所有计数求和
这是我尝试过的:
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上找不到任何特别有用的东西。
非常感谢您!
答案 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