2010-02-28 8 views
5

Łącząc 2 kolumny na 1 kolumnę wiele razy w bardzo dużym zbiorze danych w RŁącząc 2 kolumny na 1 kolumnę wiele razy w bardzo dużym zbiorze danych w R

niezdarny rozwiązań pracuję na nie będą bardzo szybko, jeśli mogę je zmusić do pracy, a prawdziwy zestaw danych to ~ 1500 X 45000, więc muszą być szybkie. Zdecydowanie przegrałem 1) w tym momencie, chociaż mam kod dla 2) i 3).

Oto przykład zabawki struktury danych:

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)) 

Zatem istnieje kilka kolumn podstawowych informacji demograficznych, a następnie pozostałe kolumny są biallelic SNP informacji. Np .: rs123 jest allelem 1 rs123 i rs123.1 jest drugim allelem rs123.

1) trzeba połączyć wszystkie biallelic danych SNP, które są aktualnie w kolumnach 2 do 1 kolumny, tak, na przykład: rs123 i rs123.1 w jedną kolumnę (ale w zbiorze)

11 
31 
11 
31 
31 
11 
11 
11 
31 
11 

2) Muszę zidentyfikować najrzadziej występującą wartość SNP (w powyższym przykładzie jest to 31).

3) muszę wymieniać najrzadziej wartość SNP z 1 i druga (y) z 0.

Odpowiedz

8

Czy masz na myśli „scalanie” lub „Zmień kolejność” lub po prostu złączyć? Jeśli to drugie następnie

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 

a teraz można zrobić liczy i etażerka na 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

pasty! Oczywiście! Chodzi mi o konkatenację. Dziękuję bardzo za pomoc. Teraz pracuję nad tym, aby działał on przez 45 000 kolumn. Dzięki jeszcze raz! –

+0

Możesz pracować z 'grep()' i 'match()', aby uzyskać indeksy kolumn. Zachęcamy również do przegłosowania i/lub zaakceptowania tej odpowiedzi, jeśli trafi ona jako właściwą :-) –

+1

zaakceptowana! :) Nie mam wystarczająco dużo punktów reputacyjnych, aby upowszechniać jeszcze ...! –

Powiązane problemy