2017-11-20 7 views
0

Ich versuche, einen Datenrahmen in R zu ändern, um mehrere Zeilen durch eine Messung zu gruppieren. Die Tabelle hat eine Position (km), eine Größe (mm) eine count von Dingen in dieser Größe bin, eine site und . Ich möchte die Größen nehmen, aus jedem eine Spalte machen (2, 4 und 6 in diesem Beispiel) und die entsprechende Anzahl in jede Zeile für diesen Ort, diese Site und dieses Jahr einfügen.Transponieren Spalte und Gruppe Datenrahmen

Es scheint wie eine Kombination aus Transponieren und Gruppierung, aber ich kann nicht einen Weg finden, dies zu tun in R. ich t() geschaut habe, dcast() und aggregate(), aber die sind nicht wirklich alle in der Nähe.

So würde ich von etwas so gehen:

df <- data.frame(km=c(rep(32,3),rep(50,3)), mm=rep(c(2,4,6),2), count=sample(1:25,6), site=rep("A", 6), year=rep(2013, 6)) 

    km mm count site year 
1 32 2 18 A 2013 
2 32 4  2 A 2013 
3 32 6 12 A 2013 
4 50 2  3 A 2013 
5 50 4 17 A 2013 
6 50 6 21 A 2013 

Um dies:

km site year mm_2 mm_4 mm_6 
1 32 A 2013 18  2 12 
2 50 A 2013 3 17 21 

Edit: ich die solution in einem vorgeschlagenen doppelten versucht, aber ich habe für mich nicht funktioniert, nicht wirklich sicher warum. Die Antwort unten funktioniert besser.

+0

'tidyr :: Spread (df, mm, Anzahl)' ' – useR

+4

Verwenden des sep' Argument in' tidyr :: Spread (df, mm, zählt, sep = "_") '' – markus

+0

Verwenden eingestellt .seed() ', um' sample() 'im Code reproduzierbar zu machen, um Ihren Beispieldatenrahmen zu erzeugen. – neilfws

Antwort

4

Wie im Kommentar oben vorgeschlagen, können wir das sep Argument in spread verwenden:

library(tidyr) 
spread(df, mm, count, sep = "_") 
    km site year mm_2 mm_4 mm_6 
1 32 A 2013 4 20 1 
2 50 A 2013 15 14 22 
2

Wie Sie dcast() erwähnt, hier ist eine Methode, es zu benutzen.

set.seed(1) 
df <- data.frame(km=c(rep(32,3),rep(50,3)), 
       mm=rep(c(2,4,6),2), 
       count=sample(1:25,6), 
       site=rep("A", 6), 
       year=rep(2013, 6)) 

library(reshape2) 
dcast(df, ... ~ mm, value.var="count") 

# km site year 2 4 6 
# 1 32 A 2013 13 10 20 
# 2 50 A 2013 3 17 1 

Und wenn Sie ein bisschen eine Herausforderung wollen, können Sie die Basisfunktion reshape() versuchen.

df2 <- reshape(df, v.names="count", idvar="km", timevar="mm", ids="mm", direction="wide") 
colnames(df2) <- sub("count.", "mm_", colnames(df2)) 
df2 

# km site year mm_2 mm_4 mm_6 
# 1 32 A 2013 13 10 20 
# 4 50 A 2013 3 17 1 
Verwandte Themen