2016-04-08 4 views
0

Ich habe einen großen Datensatz von 72 Spalten und ich möchte jede 3 Spalten in eine neue Spalte sammeln und damit 24 Spalten am Ende.Wie zu verwenden Gather() in einer for-Schleife in R

Ich habe versucht mit gather() Funktion, aber es funktioniert gut für einmal nur t = d.h., es sammeln nur 3 Spalten gleichzeitig.

Kann ich diese Funktion in einer for-Schleife verwenden?

Ich versuchte dies:

j=0 
k=1 
l=2 
for (i in 2:24){ 
    neww <- gather(columns, "KEy", "Proteins H/L", c((i+j), (i+k), (i+l)), na.rm = TRUE) 
    j=j+2; 
    k=k+2; 
    l=l+2; 
} 

I ersten 3 Spalten in einer einzigen Spalte und dann die nächsten 3 in einer anderen Spalte und so weiter zusammenstellen müssen.

+0

Bitte ein reproduzierbares Beispiel produzieren. Die Funktion 'gather()' gehört nicht zur Basis R. Aus welchem ​​Paket kommt sie? Hängen Sie Spalten an, um einen data.frame dreimal so lang zu machen, oder fügen Sie die Spalten zusammen ein? Ohne weitere Informationen wird es schwierig sein, Ihnen zu helfen. – lmo

+0

Wenn Sie die SE-Version 'gather_' verwenden, können Sie über die Spaltennamen iterieren, die Sie als Strings übergeben können. – alistaire

+0

Sammeln Sie mehrere Sätze von Spalten mit Tidyr http://StackOverflow.com/q/25925556/5249203 Haben Sie dies überprüft? Adressiert es nicht Ihr ähnliches Problem? Mögliches Duplikat? – user5249203

Antwort

0

Sie können die to_long Funktion aus dem sjmisc-package für diesen Zweck verwenden. Diese Funktion ist eine komfortable For-Schleife, die mehrere Anrufe gather() aufruft.

# create sample 
mydat <- data.frame(age = c(20, 30, 40), 
        sex = c("Female", "Male", "Male"), 
        score_t1 = c(30, 35, 32), 
        score_t2 = c(33, 34, 37), 
        score_t3 = c(36, 35, 38), 
        speed_t1 = c(2, 3, 1), 
        speed_t2 = c(3, 4, 5), 
        speed_t3 = c(1, 8, 6)) 

# check tidyr. score is gathered, however, speed is not 
tidyr::gather(mydat, "time", "score", score_t1, score_t2, score_t3) 

> age sex speed_t1 speed_t2 speed_t3  time score 
> 1 20 Female  2  3  1 score_t1 30 
> 2 30 Male  3  4  8 score_t1 35 
> 3 40 Male  1  5  6 score_t1 32 
> 4 20 Female  2  3  1 score_t2 33 
> 5 30 Male  3  4  8 score_t2 34 
> 6 40 Male  1  5  6 score_t2 37 
> 7 20 Female  2  3  1 score_t3 36 
> 8 30 Male  3  4  8 score_t3 35 
> 9 40 Male  1  5  6 score_t3 38 

# gather multiple columns. both time and speed are gathered. 
to_long(mydat, "time", c("score", "speed"), 
     c("score_t1", "score_t2", "score_t3"), 
     c("speed_t1", "speed_t2", "speed_t3")) 

>  age sex  time score speed 
> (dbl) (fctr) (chr) (dbl) (dbl) 
> 1 20 Female score_t1 30  2 
> 2 30 Male score_t1 35  3 
> 3 40 Male score_t1 32  1 
> 4 20 Female score_t2 33  3 
> 5 30 Male score_t2 34  4 
> 6 40 Male score_t2 37  5 
> 7 20 Female score_t3 36  1 
> 8 30 Male score_t3 35  8 
> 9 40 Male score_t3 38  6 

In diesem Fall wird der time Vektor (unter Angabe der versammelten Gruppen) dauert nur eine der mehreren versammelten Spaltennamen. Wenn dies zu verwirrend ist, können Sie auch die Nummer nur den ID-Variable:

to_long(mydat, "time", c("score", "speed"), 
     c("score_t1", "score_t2", "score_t3"), 
     c("speed_t1", "speed_t2", "speed_t3"), 
     recode.key = TRUE) 

>  age sex time score speed 
> (dbl) (fctr) (dbl) (dbl) (dbl) 
> 1 20 Female  1 30  2 
> 2 30 Male  1 35  3 
> 3 40 Male  1 32  1 
> 4 20 Female  2 33  3 
> 5 30 Male  2 34  4 
> 6 40 Male  2 37  5 
> 7 20 Female  3 36  1 
> 8 30 Male  3 35  8 
> 9 40 Male  3 38  6 

?to_long Beispiele für mehr sehen.

Ich bin nicht sicher, aber ich denke, dass ich etwas auf GitHub zu lesen, dass „mehrere Spalte gathering“ auch für tidyr some geplant ...