2017-05-16 10 views
0

Ich bin ein unerfahrener Benutzer von R und ich muss ziemlich komplizierte Sachen erstellen. Mein-Datensatz sieht wie folgt aus:Erstellen Sie einen Zähler in einer for-Schleife in R

dataset

a, b, c, d, e verschiedene Individuen sind. Ich möchte die D-Spalte wie folgt vervollständigen: An der letzten Zeile für jedes Individuum in der Spalte A, D = Summe (C)/(B-1).

Erwartete Ergebnisse aussehen sollte:

results

D4 = Summe (C2: C4)/(B4-1) = 0,5

D6 = Summe (C5: C6)/(B6 -1) = 1 usw.

ich es mit so etwas wie zu umgehen versucht:

for(i in 2:NROW(dataset)){ 
    dataset[i,4]<-ifelse(
    (dataset[i,1]==data1[i-1,1]),sum(dataset[i,3])/(dataset[i,2]-1),NA 
) 
} 

Aber ich t ist offensichtlich nicht ausreichend, da es den D-Wert für alle Zeilen berechnet und nicht nur den letzten für jedes Individuum, und es berechnet nicht die Summe der C-Werte für dieses Individuum.

Und ich weiß wirklich nicht, wie ich es herausfinden soll. Habt ihr einen Ratschlag? Vielen Dank.

+0

Willkommen bei SO. Bitte [werfen Sie einen Blick auf diesen Link] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Sotos

+0

Sie haben uns nicht genug Informationen zur Verfügung gestellt, hier ist der erste Datenrahmen df <- Datenrahmen (A = c ("a", "a", "a", "b", "b", "c", "c", "c", "d "," e "," e "), B = c (3,3,3,2,2,3,3,3,1,2,2), C = c (NA, 1,0, NA, 1, NA, 0,1, NA, NA, 0)) ändern Sie Ihre Frage, um uns zu sagen, wie der zweite aussieht? – user1945827

Antwort

0

Wenn ich Ihre Frage richtig verstanden habe, dann ist dies eine Annäherung an das gewünschte Ergebnis zu erhalten:

df <- data.frame(
A=c("a","a","a","b","b","c","c","c","d","e","e"), 
B=c(3,3,3,2,2,3,3,3,1,2,2), 
C=c(NA,1,0,NA,1,NA,0,1,NA,NA,0), 
stringsAsFactors = FALSE) 

for(i in 2:NROW(df)){ 
    df[i,4]<-ifelse(
    (df[i,1]!=df[i+1,1] | i == nrow(df)),sum(df[df$A == df[i,1],]$C, na.rm=TRUE)/(df[i,2]-1),NA 
) 
} 

Dieser Code führt in der folgenden Tabelle:

A B C V4 
1 a 3 NA NA 
2 a 3 1 NA 
3 a 3 0 0.5 
4 b 2 NA NA 
5 b 2 1 1.0 
6 c 3 NA NA 
7 c 3 0 NA 
8 c 3 1 0.5 
9 d 1 NA NaN 
10 e 2 NA NA 
11 e 2 0 0.0 

Die ifelse ersten Tests, wenn das Individuum der aktuellen Zeile der Spalte A ist anders als das Individuum in der nächsten Zeile ODER wenn es die letzte Zeile ist.

Wenn es die letzte Zeile mit diesem Individuum ist, nimmt es die Summe der Spalte C (ignoriert die NAs) der Zeilen mit dem Individuum in Spalte A geteilt durch den Wert in Spalte B minus Eins.

Sonst setzt es eine NA in der vierten Spalte.

0

dplyr Verwenden Sie versuchen können, D für alle Zeilen zu erzeugen und dann entfernen, wenn nicht benötigt:

dftest %>% 
    group_by(A,B) %>% 
    dplyr::mutate(D = sum(C, na.rm=TRUE)/(B-1)) %>% 
    dplyr::mutate(D = if_else(row_number()== n(), D, as.double(NA))) 

die gibt:

Source: local data frame [11 x 4] 
Groups: A, B [5] 

     A  B  C  D 
    <chr> <dbl> <dbl> <dbl> 
1  a  3 NA NA 
2  a  3  1 NA 
3  a  3  0 0.5 
4  b  2 NA NA 
5  b  2  1 1.0 
6  c  3 NA NA 
7  c  3  0 NA 
8  c  3  1 0.5 
9  d  1 NA NaN 
10  e  2 NA NA 
11  e  2  0 0.0 
Verwandte Themen