2015-07-16 5 views
5

Hier sind meine Daten:R: Berechnung des Quotienten aus zwei Spalten von ID

ID  nb  ecart  
ID1  3  NA 
ID1  3  0  
ID1  3  1.5 
ID2  2  NA 
ID2  2  648 
ID3  4  NA 
ID3  4  0 
ID3  4  0 
ID3  4  7 

ich den Prozentsatz der Anzahl der ecart berechnet werden soll, die „0“ für jede ID ==.

nb ist die Variable, die die Anzahl der Zeilen für jede ID anzeigt.

Das exceped Ergebnis:

ID  nb  ecart percentage 
ID1  3  NA  NA 
ID1  3  0  1/3 
ID1  3  1.5  NA 
ID2  2  NA  NA 
ID2  2  648  NA 
ID3  4  NA  NA 
ID3  4  0  2/4 
ID3  4  0  2/4 
ID3  4  7   NA 

Hoffnung Ihre Antwort bald zu erhalten! Vielen Dank!

+0

Mögliche Duplikat [diese] (http://stackoverflow.com/questions/31439306/how-to-make-an-average-of-a-variable-assigned-to-individuals-within-a -kategorie/31439514 # 31439514); Darüber hinaus ist die Ausgabe Note klar, weil 'ecart == 0' ist 2/4 für 'ID3' – SabDeM

+0

@SabDeM Ich habe aktualisiert. Danke für deine Bemerkung. – velvetrock

+0

Willst du wirklich '1/3' oder willst du' .333' – MichaelChirico

Antwort

8

Eine schnelle und effiziente data.table Lösung

library(data.table) 
setDT(df)[ecart == 0L, percentage := round(.N/nb, 2L), by = ID] 
#  ID nb ecart percentage 
# 1: ID1 3 NA   NA 
# 2: ID1 3 0.0  0.33 
# 3: ID1 3 1.5   NA 
# 4: ID2 2 NA   NA 
# 5: ID2 2 648.0   NA 
# 6: ID3 4 NA   NA 
# 7: ID3 4 0.0  0.50 
# 8: ID3 4 0.0  0.50 
# 9: ID3 4 7.0   NA 

Wie das funktioniert: Diese die Werte von percentagedurch Bezugnahme ändern wird nur dann, wenn ecart == 0L durch die Größe der Untergruppe der Berechnung (mit .N) durch nb

geteilt

Oder (wie von @CathG kommentierte), wenn Sie einen hübschen Zeichenabdruck anstelle eines numerischen Werts wünschen, Sie können

setDT(df)[ecart == 0L, percentage := paste0(.N, "/", nb), by = ID] 

tun Oder wenn Sie es vorziehen, ein binäres zu verwenden beitreten

setkey(setDT(df), ecart)[.(0L), percentage := paste0(.N, "/", nb), by = ID] 
+0

Sie angenommen,' nb' ist das volle '.N', was ich denke, ist richtig ... – MichaelChirico

+0

@MichaelChirico Ich habe nicht" angenommen " Das hat der OP selbst gesagt. Und ich zitiere: "* nb ist die Variable, die die Anzahl der Zeilen für jede ID * zeigt". –

+1

sehr wahr! Ich schwöre, ich bin Teil blind. – MichaelChirico

3

Hier ist eine dplyr Antwort.

library(dplyr) 

data %>% 
    group_by(ID) %>% 
    mutate(percentage = 
     ifelse(is.na(ecart), 
       NA, 
       sum(ecart == 0, na.rm = TRUE)/n()))