2017-05-25 1 views
0

Neuformatierung Ich habe ein data.frame dieses Format:ein R data.frame

set.seed(1) 
pl.mat <-matrix(rnorm(500*1000),nrow=500,ncol=1000) 
colnames(pl.mat) <- gsub("\\s+","",apply(expand.grid(paste("pl",1:10,sep=""),1:100),1,function(x) paste(unlist(x),collapse=".")),perl=T) 
df <- cbind(data.frame(id=1:500,group.id=rep(1:25,20)),pl.mat) 

> df[1:5,1:5] 
    id group.id  pl1.1  pl2.1  pl3.1 
1 1  1 -0.6264538 0.07730312 1.13496509 
2 2  2 0.1836433 -0.29686864 1.11193185 
3 3  3 -0.8356286 -1.18324224 -0.87077763 
4 4  4 1.5952808 0.01129269 0.21073159 
5 5  5 0.3295078 0.99160104 0.06939565 

df$id von df$group.id gruppiert sind. Dann hat jede Spalte eine experimentelle Platten-ID (pl1 - pl10), und die auf das Periodentrennzeichen folgende Ganzzahl ist eine Wannen-ID (1-100). Daher hat jede Platte 100 Spalten.

Ich mag eine neue data.frame, die diese Säulen bauen: df$id, df$group.id, gut-ID und die alle Platten.

Bedeutung dieses Format:

id group.id  well.id  pl1  pl2  pl3 
1 1    1  -0.6264538 0.07730312 1.13496509 
1 1    2   ...  ...  ... 
. 
. 
. 
1 2    1   ...  ...  ... 
. 
. 
. 
500 25 .  100   ...  ...  ... 

Jeder gute prägnant Code für das?

Antwort

1
df %>% 
    gather(var, val, -id, -group.id) %>% 
    separate(var, c("pl.id", "well.id")) %>% 
    spread(pl.id, val) 
+0

Für meine realen Daten erhalte ich: Fehler: C-Stack-Nutzung 135.438.240 ist zu nahe an der Grenze. Liegt das an einer Rekursion, die eine dieser Funktionen anwendet? Wenn ja, gibt es eine nicht-rekursive Alternative? – dan

+0

Vermute, dass der Datensatz zu groß ist, um diesen Fehler zu erzeugen. Es gibt einige Diskussionen über [Fehler: Die C-Stack-Nutzung ist zu nah am Limit] (https://stackoverflow.com/questions/14719349/error-c-stack-usage-is-too-close-to-the-limit). Sehen Sie, ob Sie Ihre Daten zuerst in kleinere Abschnitte aufteilen können. Außerdem könntest du 'reshape2 :: schmelzen' und 'dcast' versuchen anstatt zu sammeln und zu verbreiten. –

1

Dan, Sie könnten eine neue data.frame mit den gewünschten Spalten erstellen. Angenommen, Sie Spalte wollen df$id und df$group.id:

newDF <- as.data.frame(cbind(df[,2], df[,5])):

newDF <- as.data.frame(cbind(df$id, df$group.id))

Nun, wenn Sie eine so große Menge an Spalten hatte, wo man nicht schreiben unkenntlich machen können, können Sie den Index als auch nutzen könnten

Daher reicht auch Arbeit:

newDF <- as.data.frame(cbind(df[,2:210], df[,507:1020]))

Funktioniert das für Sie? Eine andere Lösung wäre, eine Schleife zu verwenden und die Indizes oder Spaltennamen dynamisch zu konstruieren. Hier ein Entwurf:

for(i in 1:10) { 
    print(eval(parse(text=paste("df$id", i, sep = "")))) 
} 

Hier werden die Spaltennamen df$id1 bis zu df$id10 wird dynamisch aufzubauen.

Mit freundlichen Grüßen, Thorsten

Verwandte Themen