2011-07-25 10 views
9

Mam ramkę danych, w której chcę użyć pewnych wartości jako klawiszy skrótu/słownika (lub jakkolwiek go nazwiesz w wybranym przez ciebie języku) dla innych wartości w tej ramce danych. Że mam dataframe takiego który czytałem z dużym pliku csv (tylko pierwszy rząd pokazany):Jak używać elementów ramek danych, takich jak klawisze skrótów/klucze słownika/klucze podstawowe?

Plate.name QN.number Well Allele.X.Rn Allele.Y.Rn Call 
1 Plate 1_A1 QN2200 A  1.766  2.791 Both 

które w kodzie R będzie:

structure(list(Plate.name = structure(1L, .Label = "Plate 1_A1", class = "factor"), 
    QN.number = structure(1L, .Label = "QN2200", class = "factor"), 
    Well = structure(1L, .Label = "A1", class = "factor"), Allele.X.Rn = 1.766, 
    Allele.Y.Rn = 2.791, Call = structure(1L, .Label = "Both", class = "factor")), .Names = c("Plate.name", 
"QN.number", "Well", "Allele.X.Rn", "Allele.Y.Rn", "Call"), class = "data.frame", row.names = c(NA, 
-1L)) 

THe QN.numbers są unikalne identyfikatory w moim zestawie danych. W jaki sposób następnie pobierać dane za pomocą QN.number jako odniesienia dla innych wartości, to znaczy chcę znać Call lub Allele.X.Rn dla danego numeru QN.? Wygląda na to, że row.names może zrobić lewę, ale jak mógłbym ich użyć w tym przypadku?

+0

+1 dla powtarzalne przykład i dobrze zadane pytanie. –

+0

Nazwy wierszy w ramce danych muszą być unikalne (jak w haszdzie lub słowniku), więc możesz chcieć zrobić to sprawdzić przed użyciem QN.number w row.names(). Coś w rodzaju 'sum (tapply (d $ a, d $ a, length)> 1)' powie ci, ile duplikatów znajduje się w kolumnie a ramki danych d. – Seth

+0

Ah tak dzięki Seth, powinienem wspomnieć, że QN.number jest unikalnym identyfikatorem. Będę edytować pytanie – arandomlypickedname

Odpowiedz

5

Korzystanie row.names jest tak:

> row.names(d)=d$QN.number 
> d["QN2200",] 
     Plate.name QN.number Well Allele.X.Rn Allele.Y.Rn Call 
QN2200 Plate 1_A1 QN2200 A1  1.766  2.791 Both 
> d["QN2201",] 
    Plate.name QN.number Well Allele.X.Rn Allele.Y.Rn Call 
NA  <NA>  <NA> <NA>   NA   NA <NA> 

po prostu użyć nazwy wiersza jako pierwszy parametr w podzbioru. Można również użyć wielu nazw wierszy:

> d=data.frame(a=letters[1:10],b=runif(10)) 
> row.names(d)=d$a 
> d[c("a","g","d"),] 
    a   b 
a a 0.6434431 
g g 0.6724661 
d d 0.9826392 

Teraz nie jestem pewien, jak mądry jest, i czy robi sekwencyjnego wyszukiwania nazwy każdego wiersza lub szybsze indeksowanie ...

+0

Dzięki za pomoc – arandomlypickedname

0

Zakładając, że mamy do przechowywania naszą ramkę danych w nazwie zmiennej - I'll nazwać dataframe teraz - dodaje powinno wystarczyć:

dataframe$Allele.X.Rn[which(dataframe$Qn.number == <whatever>)]

Gdzie oczywiście <whatever> jest numer, który ma być używany pod adresem Qn.number.

+1

Nie potrzebujesz połączenia z 'który'; indeksowanie logiczne jest w porządku. –

+0

Huh ... więc tak. Dziękuję za wskazanie tego! –

+2

Inną opcją będzie: 'ramka danych [ramka danych $ QN.numer ==" QN2200 "," Allele.Y.Rn "]'. –

4

Użyj subset.

subset(your_data, QN.number == "QN2200", Allele.X.Rn) 

with stanowi alternatywę; tutaj wyjście to wektor, a nie kolejna ramka danych.

with(your_data, Allele.X.Rn[QN.number == "QN2200"]) 
+0

Mogę uzyskać podzbiór do pracy na dostarczonym przeze mnie zestawie danych testowych, ale nie mogę go uzyskać przez całe życie, aby pracować nad prawdziwym zestawem danych: budzący lęk "niezdefiniowane kolumny wybrane" – arandomlypickedname

Powiązane problemy