2016-11-02 122 views
2

假设我有数据帧这样一个计数中的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 

我希望计算特定Id非零条目可变Z的数量和记录一个新列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 

回答

7

我们可以用基础R ave

通过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 
3

你可以试试这个计数非零值的数量为分组列Z,它给你你想要什么:

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 
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 
+0

只有在原始数据中'Id'按数字顺序排列。 –

+0

是的,这是从例子中的假设 –