计算R中列的非零值

时间:2016-11-02 17:16:14

标签: r

假设我有像这样的数据框

DF

Id X Y Z 
1  1 5 0
1  2 0 0
1  3 0 5
1  4 9 0
1  5 2 3
1  6 5 0 
2  1 5 0
2  2 4 0
2  3 0 6
2  4 9 6
2  5 2 0
2  6 5 2 
3  1 5 6
3  2 4 0
3  3 6 5
3  4 9 0
3  5 2 0
3  6 5 0

我想计算特定Z中变量Id的非零条目数,并在新列Count中记录该值,因此新数据框看起来像

DF1

Id X Y Z Count 
1  1 5 0  2
1  2 4 0  2
1  3 6 5  2
1  4 9 0  2
1  5 2 3  2
1  6 5 0  2 
2  1 5 0  3
2  2 4 0  3
2  3 6 6  3
2  4 9 6  3
2  5 2 0  3
2  6 5 2  3
3  1 5 6  2
3  2 4 0  2
3  3 6 5  2
3  4 9 0  2
3  5 2 0  2
3  6 5 0  2

3 个答案:

答案 0 :(得分:7)

我们可以使用基础R ave

计算按Z分组的列Id的非零值数

df$Count <- ave(df$Z, df$Id, FUN = function(x) sum(x!=0))
df$Count

#[1] 2 2 2 2 2 2 3 3 3 3 3 3 2 2 2 2 2 2

答案 1 :(得分:3)

你可以尝试这个,它可以为你提供你想要的东西:

library(data.table)
dt <- data.table(df)

dt[, Count := sum(Z != 0), by = Id]

dt
#     Id X Y Z Count
#  1:  1 1 5 0     2
#  2:  1 2 0 0     2
#  3:  1 3 0 5     2
#  4:  1 4 9 0     2
#  5:  1 5 2 3     2
#  6:  1 6 5 0     2
#  7:  2 1 5 0     3
#  8:  2 2 4 0     3
#  9:  2 3 0 6     3
# 10:  2 4 9 6     3
# 11:  2 5 2 0     3
# 12:  2 6 5 2     3
# 13:  3 1 5 6     2
# 14:  3 2 4 0     2
# 15:  3 3 6 5     2
# 16:  3 4 9 0     2
# 17:  3 5 2 0     2
# 18:  3 6 5 0     2

答案 2 :(得分:1)

这也有效:

df$Count <- rep(aggregate(Z~Id, df[df$Z != 0,], length)$Z, table(df$Id))

   Id X Y Z Count
1   1 1 5 0     2
2   1 2 0 0     2
3   1 3 0 5     2
4   1 4 9 0     2
5   1 5 2 3     2
6   1 6 5 0     2
7   2 1 5 0     3
8   2 2 4 0     3
9   2 3 0 6     3
10  2 4 9 6     3
11  2 5 2 0     3
12  2 6 5 2     3
13  3 1 5 6     2
14  3 2 4 0     2
15  3 3 6 5     2
16  3 4 9 0     2
17  3 5 2 0     2
18  3 6 5 0     2