2016-11-02 14 views
2

Angenommen, ich habe Datenrahmen wie diesesCount Werte ungleich Null der Spalte in 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 

Ich mag für variable Z in einer bestimmten Id die Anzahl der Nicht-Null-Einträge zählen und notieren Sie diesen Wert in einer neuen Spalte Count, so wird der neue Datenrahmen aussehen

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 

Antwort

7

Wir Basis R ave

Zählen der Anzahl der Nicht-Null-Werte für Spalte Z gruppiert nach 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

verwenden können Sie diese versuchen können, es gibt Ihnen genau das, was Sie wollen:

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

Dies wird auch funktionieren:

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

Nur wenn "Id" in den ursprünglichen Daten in numerischer Reihenfolge ist. –

+0

ja das war die annahme aus dem beispiel –

Verwandte Themen