2016-04-20 4 views
3

Ich arbeite mit einem Datensatz, der die Werte der gleichen Variablen zu verschiedenen Zeitpunkten enthält. Im Beispiel unten ich die Werte der Variablen a und b zu den Zeitpunkten haben 1 und 2.Wie mache ich Iterationen in R?

> set.seed(1) 
> data <- data.frame(matrix(sample(16), ncol = 4)) 
> names(data) <- paste(rep(c("a", "b"), each = 2), 1:2, sep = "") 
> data 
    a1 a2 b1 b2 
1 5 3 14 13 
2 6 10 1 8 
3 9 11 2 4 
4 12 15 7 16 

Nun nehme ich eine neue Variable für beide Zeitpunkte berechnet werden soll, so dass sie die Summe von a enthalten würde und b (anstelle der NAs wie im folgenden Beispiel). Da mein tatsächlicher Datensatz ungefähr 15 verschiedene Variablen und 10 Zeitpunkte (also 150 Spalten) enthält, möchte ich diese Berechnung von 10 neuen Variablen automatisieren.

> data[, paste("ab", 1:2, sep = "")] <- NA 
> data 
    a1 a2 b1 b2 ab1 ab2 
1 5 3 14 13 NA NA 
2 6 10 1 8 NA NA 
3 9 11 2 4 NA NA 
4 12 15 7 16 NA NA 

Ich habe vorher Stata verwendet, wo ich eine einfache ‚foreach‘ Schleife, dies zu tun schaffen könnte. Etwas wie unten.

foreach t of numlist 1/2 { 
    generate ab`t' = a`t' + b`t' 
} 

Aber ich habe gelernt, dass Schleifen in R mit nicht möglich ist, noch habe ich keine Ahnung, wie über Variablennamen Schleife wie in R.

Also, was die richtige Lösung wäre für meine Problem in R?

+1

ähnlich: http://stackoverflow.com/questions/36432686/r-how-to-sum-pairs-in-a-matrix-by-row – jogo

+2

Sie könnten auch Ziehen Sie in Erwägung, Ihre Daten in ein langes Format zu konvertieren.So ist es nicht sauber Daten, wie Sie Informationen in den Spaltennamen haben. – Heroka

+0

@Heroka Ich habe die Daten tatsächlich auf Wide Format umgestaltet, da es einfacher zu arbeiten schien. Aber du hast Recht damit, dass es nicht ordentlich ist, also denke ich vielleicht darüber nach. – lillemets

Antwort

2

dies die R Art und Weise zu tun,

  1. nutzen einige nativen Iteration über eine *apply Funktion
  2. verwenden, um die integrierte in rowSums (wie in @Sotos) antwort
  3. verwenden o f Zuordnung in die data.frame, das heißt `]` < -

alle zusammen

data[paste0('ab', 1:2)] <- sapply(1:2, 
            function(i) 
            rowSums(data[paste0(c('a', 'b'), i)])) 
data 

# a1 a2 b1 b2 ab1 ab2 
# 1 5 3 14 13 19 16 
# 2 6 10 1 8 7 18 
# 3 9 11 2 4 11 15 
# 4 12 15 7 16 19 31 

ps in einem Programm verwenden vapply stattdessen müssen Sie ein zusätzliches Argument schaffen, die Angabe der Form der Ausgabe, aber es ist sicherer und manchmal schneller

2

Sie können ohne Iteration tun:

data$ab1 <- data$a1 + data$b1 
data$ab2 <- data$a2 + data$b2 

oder

data <- transform(data, ab1=a1+b1, ab2=a2+b2) 

BTW:
Es ist besser, nicht um ein Objekt zu nennen data weil data= ist oft ein Parameter in Funktionen.

+0

Ich weiß, ich kann ohne Iteration, sondern war explizit für eine anspruchsvollere Lösung ((Und wie gesagt, mein ursprünglicher Datensatz enthält Werte für ungefähr 15 Variablen zu 10 Zeitpunkten, so dass mein R - Code ziemlich unordentlich würde, wenn ich einfach jede einzelne Berechnung eintippte.) – lillemets

+0

ok, für eine komplexere Situation gab ich den Link http://stackoverflow.com/questions/36432686/r-how-to-sum-pairs-in-a-matrix-by-row Der andere Hinweis wurde von Heroka gegeben : Umformung zu langem Format. (oder in Ihrem Fall: nicht auf das Wide-Format zu gestalten.) – jogo

2

Hier ist eine Möglichkeit, es zu tun. Wir durchlaufen die eindeutigen Werte der Spaltennamen und berechnen rowSums, wenn diese eindeutigen Werte den Spaltennamen entsprechen.

sapply(unique(sub('\\D', '', names(data))), 
      function(i) rowSums(data[,grepl(i, sub('\\D', '', names(data)))])) 
#  1 2 
#[1,] 17 23 
#[2,] 24 22 
#[3,] 14 10 
#[4,] 15 11 
3

Dies wird die gleiche foreach-Schleife replizieren Sie in Stata verwendet.

for(i in 1:2){ 
    data[, paste("ab", i, sep="")] <- 
    data[,paste("a", i, sep="")] + data[, paste("b", i, sep="")] 
} 

Die Ausgabe sieht wie folgt aus:

> data 
    a1 a2 b1 b2 ab1 ab2 
1 15 1 16 12 31 13 
2 10 7 14 3 24 10 
3 2 5 9 4 11 9 
4 6 8 13 11 19 19 
+0

Ich habe versucht eine Schleife, aber konnte nicht herausfinden, wie man auf Spalten mit einer solchen Schleife Variable. Vielen Dank! – lillemets

+2

Sie können 'paste0 (...)' anstelle von 'einfügen (..., sep =" ")' – jaimedash