2010-02-28 8 views
5

Combinando 2 colonne in 1 colonna molte volte in un grande insieme di dati in RCombinando 2 colonne in 1 colonna molte volte in un grande insieme di dati in R

Le soluzioni maldestri sto lavorando non stanno per essere molto veloce se riesco a farli funzionare e il set di dati vero è ~ 1500 X 45000 quindi devono essere veloci. Sono decisamente in perdita per 1) a questo punto, anche se ho qualche codice per 2) e 3).

Ecco un esempio giocattolo della struttura dati:

pop = data.frame(status = rbinom(n, 1, .42), sex = rbinom(n, 1, .5), 
age = round(rnorm(n, mean=40, 10)), disType = rbinom(n, 1, .2), 
rs123=c(1,3,1,3,3,1,1,1,3,1), rs123.1=rep(1, n), rs157=c(2,4,2,2,2,4,4,4,2,2), 
rs157.1=c(4,4,4,2,4,4,4,4,2,2), rs132=c(4,4,4,4,4,4,4,4,2,2), 
rs132.1=c(4,4,4,4,4,4,4,4,4,4)) 

Quindi, ci sono un paio di colonne di informazioni demografiche di base e poi il resto delle colonne sono biallelica informazioni SNP. Esempio: rs123 è l'allele 1 di rs123 e rs123.1 è il secondo allele di rs123.

1) Ho bisogno di unire tutti i dati biallelica SNP che è attualmente in 2 colonne in 1 colonna, così, ad esempio: rs123 e rs123.1 in una colonna (ma entro il set di dati):

11 
31 
11 
31 
31 
11 
11 
11 
31 
11 

2) Devo identificare il valore SNP meno frequente (nell'esempio sopra riportato è 31).

3) Ho bisogno di sostituire il valore minimo SNP frequenti con 1 e l'altro (s) con 0.

risposta

8

Vuoi dire 'merge' o 'riorganizzare' o semplicemente concatenare? Se è quest'ultimo allora

R> pop2 <- data.frame(pop[,1:4], rs123=paste(pop[,5],pop[,6],sep=""), 
+        rs157=paste(pop[,7],pop[,8],sep=""), 
+        rs132=paste(pop[,9],pop[,10], sep="")) 
R> pop2 
    status sex age disType rs123 rs157 rs132 
1  0 0 42  0 11 24 44 
2  1 1 37  0 31 44 44 
3  1 0 38  0 11 24 44 
4  0 1 45  0 31 22 44 
5  1 1 25  0 31 24 44 
6  0 1 31  0 11 44 44 
7  1 0 43  0 11 44 44 
8  0 0 41  0 11 44 44 
9  1 1 57  0 31 22 24 
10  1 1 40  0 11 22 24 

e ora si può fare i conteggi e quant'altro su pop2:

R> sapply(pop2[,5:7], table) 
$rs123 

11 31 
6 4 

$rs157 

22 24 44 
3 3 4 

$rs132 

24 44 
2 8 

R> 
+0

pasta! Ovviamente! Volevo dire concatenare. Grazie mille per l'aiuto. Ora sto lavorando per farlo funzionare su 45.000 colonne. Grazie ancora! –

+0

Puoi lavorare con 'grep()' e 'match()' per ottenere gli indici delle colonne. Inoltre, sentiti libero di votare e/o accettare questa risposta se ti colpisce come quella giusta :-) –

+1

accettato! :) Non ho abbastanza punti reputazione apparentemente da upvotare ancora ...! –

Problemi correlati