2016-10-04 4 views
-3

Ich habe einen Datenrahmen wie dieser, zusammengesetzt aus 500 Zeilen und 60 Spalten.Ändern des Datenrahmens in R

**%d1 %d2 %d3** 

PR1 0,1 0,2 0,2 ​​

PR2 0,0 0,1 0,1

PR3 0,3 0,3 0,3

PR4 0,2 0,4 0,4 ​​

Ich möchte, für jeden Datensatz in dieser Art und Weise um eine Zeile zu bilden

**% 

pr1 0,1

pr1 0,2

pr1 0,2

PR2 0,0

PR2 0,1

pr2 0.1

PR3 0,2

PR3 0,4

.....

wie kann ich es tun?

+1

Es Ihre Frage reproduzierbar hilft erlauben zu machen, verwendet dput (Kopf (df)), um eine kleine Probe Ihres df auszugeben, die andere verwenden können, um Ihnen mit Ihrem Problem zu helfen –

Antwort

0

Sie können dies mit den Bibliotheken dplyr und reshape2 tun. Ich brauchte auch eine ID-Spalte von mutmaßlich row.names zu erstellen:

Erstellen Sie Ihre Daten:

df = data.frame(d1=c(0.1,0,0.3,0.2), d2=c(0.2,0.1,0.3,0.4), d3=c(0.2,0.1,0.3,0.4)) 
row.names(df) = c("pr1", "pr2", "pr3", "pr4") 

Berechnung: was happenning ist zunächst fügen wir die id Spalte, dann wir „factorize“, um die Datenrahmen, dann Ich ändere den Tag im Zeichen zu numerisch und bestelle durch Identifikation, um das gleiche Ergebnis wie dein zu erhalten.

library(dplyr); library(tibble); library(reshape2) 
df %>% rownames_to_column("id") %>% melt %>% mutate(day=as.numeric(variable)) %>% 
    select(id, day, pc_cum=value) %>% arrange(id) 
####  id day pc_cum 
#### 1 pr1 1 0.1 
#### 2 pr1 2 0.2 
#### 3 pr1 3 0.2 
#### 4 pr2 1 0.0 
#### 5 pr2 2 0.1 
+0

Es hat funktioniert, danke. Und was, wenn ich eine andere Variable als Spalte hinzufügen möchte? Zum Beispiel das Vorhandensein eines Videos oder nicht für jedes Projekt, in welcher Position sollte ich es im Code hinzufügen? –

+0

Nun, ich bin mir nicht sicher, aber wenn du in deinen Originaldaten eine vierte Spalte mit dem Namen 'video' aus 0 & 1 hast, musst du sie in den' melt' Argumenten angeben: '...%>% schmelzen (id.vars = c ("id", "vid"))%>% ... 'und füge es auch in die Auswahl ein:' ...%>% select (id, day, pc_cum = value, vid)%>%. ..' – agenis

1

Sie können die Schmelze() Funktion aus dem reshape2 Paket verwenden. Es konvertiert einen Datenrahmen von breit nach lang.

D <- data.frame(
    c("pr1","pr2","pr3","pr4"), 
    c(0.1,0.0,0.3,0.2), 
    c(0.2,0.1,0.3,0.4), 
    c(0.2,0.1,0.3,0.4) 
) 

colnames(D) <- c("id", 1:(ncol(D)-1)) 

library(reshape2) # for melt function 
D2 <- melt(D, value.name="id") 

Ergebnis:

> print(D2[order(D2$id),]) 
    id variable id 
1 pr1  1 0.1 
5 pr1  2 0.2 
9 pr1  3 0.2 
2 pr2  1 0.0 
6 pr2  2 0.1 
10 pr2  3 0.1 
3 pr3  1 0.3 
7 pr3  2 0.3 
11 pr3  3 0.3 
4 pr4  1 0.2 
8 pr4  2 0.4 
12 pr4  3 0.4 
2

etwas anders:

data=data.frame(id=c("pr1","pr2","pr3","pr4"), 
       d1=c(0.1,0,0.3,0.2), 
       d2=c(0.2,0.1,.3,0.4), 
       d3=c(0.2,0.1,0.3,0.4)) 
library(reshape2) 
library(dplyr) 
data%>%melt(id.vars="id")%>%group_by(id,value)%>%summarise(count=n()) 

Gibt:

 id value count 
    <fctr> <dbl> <int> 
1 pr1 0.1  1 
2 pr1 0.2  2 
3 pr2 0.0  1 
4 pr2 0.1  2 
5 pr3 0.3  3 
6 pr4 0.2  1 
7 pr4 0.4  2 
1

Die unten Version tidyr verwendet, die im wesentlichen 2.0 ist reshape2, und ist so konzipiert, mit der Ordinary-Suite zu arbeiten von Paketen, die dplyr, ggplot2 etc. enthalten Der Code sammelt die Daten in eine lange, saubere Form und konvertiert die Variablenheader in eine neue Spalte, aber ohne die Spalte "id". Die Daten werden dann in der Reihenfolge id angeordnet, und die Spalte, die die vorherigen Header darstellt, wurde gelöscht.

library(tidyr);library(dplyr) 
data %>% gather(., key="var", value="value", -id) %>% 
arrange(id) %>% 
select(-var) 

Es kann sinnvoll sein, um die „var“ Spalte zu halten, da es eine größere Flexibilität bei der späteren Verarbeitung oder Visualisierungen (zB Färben nach dieser Spalte)

Verwandte Themen