2013-04-04 12 views
6

ho un frame di dati che sembra un po 'come questo:colonne vincolante con nomi di colonna simili nella stessa dataframe in R

df <- data.frame(0:2, 1:3, 2:4, 5:7, 6:8, 2:4, 0:2, 1:3, 2:4) 
colnames(df) <- rep(c('a', 'b', 'c'), 3) 
> df 
    a b c a b c a b c 
1 0 1 2 5 6 2 0 1 2 
2 1 2 3 6 7 3 1 2 3 
3 2 3 4 7 8 4 2 3 4 

Non ci sono più colonne che hanno lo stesso nome. Vorrei riorganizzare il frame di dati in modo che le colonne con gli stessi nomi si combinano nella propria supercolumn, in modo che ci sono solo i nomi di colonna univoci a sinistra, per esempio:

> df 
    a b c 
1 0 1 2 
2 1 2 3 
3 2 3 4 
4 5 6 2 
5 6 7 3 
6 7 8 4 
7 0 1 2 
8 1 2 3 
9 2 3 4 

Dei pensieri su come fare questo? Grazie in anticipo!

+0

Benvenuti a Stack Overflow! Per favore, mostra anche cosa hai provato fino ad ora. SO non è un posto dove ottenere il tuo codice scritto gratuitamente. Inoltre, raccontare ciò che hai provato fino ad ora mostra anche che stai davvero cercando di imparare dalla soluzione e non sono solo dopo la soluzione –

+3

... @ geektrader, ma ha fornito un esempio riproducibile, che è lui il mio upvote.Inoltre, la domanda è ben limitata, con una risposta chiara, che è confermata dal gran numero di risposte in pochi minuti. Ci sono esempi molto peggiori di persone che ci chiedono di fare il loro lavoro. –

+0

@geektrader - Grazie per il benvenuto! Terrò sicuramente il tuo consiglio in mente per il futuro. E ti assicuro che ho provato un sacco di cose prima di postare. – tkvn

risposta

7

questo farà il trucco, suppongo.

Spiegazione

df[,names(df) == 'a'] selezionerà tutte le colonne con nome a

unlist convertirà sopra colonne in 1 singolo vettore

unname rimuoverà alcuni rownames randagi dati a questi vettori.

unique(names(df)) vi darà i nomi delle colonne unici df

sapply si applica la funzione inline a tutti i valori di unique(names(df))

> df 
    a b c a b c a b c 
1 0 1 2 5 6 2 0 1 2 
2 1 2 3 6 7 3 1 2 3 
3 2 3 4 7 8 4 2 3 4 
> sapply(unique(names(df)), function(x) unname(unlist(df[,names(df)==x]))) 
     a b c 
[1,] 0 1 2 
[2,] 1 2 3 
[3,] 2 3 4 
[4,] 5 6 2 
[5,] 6 7 3 
[6,] 7 8 4 
[7,] 0 1 2 
[8,] 1 2 3 
[9,] 2 3 4 
+0

Questo era quasi identico a quello che mi è venuto in mente, tranne che ripulito usando 'unname' - quindi: +1. – thelatemail

0

Ora non sono al computer, quindi non posso testarlo, ma ... questo potrebbe funzionare:

do.call(cbind, 
    lapply(names(df) function(x) do.call(rbind, df[, names(df) == x]))) 
2

Usa %in% e alcuni unlisting

zz <- lapply(unique(names(df)), function(x,y) as.vector(unlist(df[which(y %in% x)])),y=names(df)) 
names(zz) <- unique(names(df)) 
as.data.frame(zz) 
    a b c 
1 0 1 2 
2 1 2 3 
3 2 3 4 
4 5 6 2 
5 6 7 3 
6 7 8 4 
7 0 1 2 
8 1 2 3 
9 2 3 4 
5

La mia versione:

library(reshape) 
as.data.frame(with(melt(df), split(value, variable))) 
    a b c 
1 0 1 2 
2 1 2 3 
3 2 3 4 
4 0 1 2 
5 1 2 3 
6 2 3 4 
7 0 1 2 
8 1 2 3 
9 2 3 4 

Nel passo utilizzando melt trasformo il set di dati:

> melt(df) 
Using as id variables 
    variable value 
1   a  0 
2   a  1 
3   a  2 
4   b  1 
5   b  2 
6   b  3 
7   c  2 
8   c  3 
9   c  4 
10  a  0 
11  a  1 
12  a  2 
13  b  1 
14  b  2 
15  b  3 
16  c  2 
17  c  3 
18  c  4 
19  a  0 
20  a  1 
21  a  2 
22  b  1 
23  b  2 
24  b  3 
25  c  2 
26  c  3 
27  c  4 

Poi sciolse colonna value per ogni livello unico di variable usando split:

$a 
[1] 0 1 2 0 1 2 0 1 2 

$b 
[1] 1 2 3 1 2 3 1 2 3 

$c 
[1] 2 3 4 2 3 4 2 3 4 

allora questo necessita solo as.data.frame diventa la struttura dati di cui hai bisogno.

2

vorrei ordinare la data.frame dal nome della colonna, non elencati, e utilizzare as.data.frame su un matrix:

A <- unique(names(df))[order(unique(names(df)))] 
B <- matrix(unlist(df[, order(names(df))], use.names=FALSE), ncol = length(A)) 
B <- setNames(as.data.frame(B), A) 
B 
# a b c 
# 1 0 1 2 
# 2 1 2 3 
# 3 2 3 4 
# 4 5 6 2 
# 5 6 7 3 
# 6 7 8 4 
# 7 0 1 2 
# 8 1 2 3 
# 9 2 3 4 
+0

+1, anche se il codice sembra abbastanza scoraggiante, ma forse molto meno quindi alcune delle altre risposte ... –

Problemi correlati