2011-07-25 2 views
9

У меня есть dataframe, в котором я хочу использовать определенные значения в качестве хеш-ключей/словарных клавиш (или того, что вы называете на выбранном вами языке) для других значений в этом фрейме. Скажем, у меня есть dataframe подобное, которые я прочитал в из большого файла CSV (только первая строка) показано:Как использовать элементы фрейма данных, такие как ключи хеша/ключи словаря/первичные ключи?

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

который в R кода будет:

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

тне QN.numbers являются уникальными идентификаторами в моем наборе данных. Как затем получить данные с помощью QN.number в качестве ссылки для других значений, то есть я хочу знать Call или Allele.X.Rn для данного QN.number? Кажется, row.names может сделать трюк, но тогда как я буду использовать их в этом случае?

+0

+1 для воспроизводимого пример и хорошо заданный вопрос. –

+0

Имена строк в кадре данных должны быть уникальными (как в хеше или словаре), поэтому вы можете выполнить эту проверку перед использованием QN.number в row.names(). Что-то вроде 'sum (tapply (d $ a, d $ a, length)> 1)' расскажет вам, сколько дубликатов находится в столбце a фрейма данных d. – Seth

+0

Ах да спасибо Сет, я должен был упомянуть, что QN.number - уникальный идентификатор. Я отредактирую вопрос – arandomlypickedname

ответ

5

Использование row.names как это:

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

Вы просто использовать имя строки в качестве первого параметра в Подменю. Вы также можете использовать несколько имена строк:

> 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 

Теперь я не знаю, как умное это, и делает ли это последовательный поиск для каждого имени строки или быстрее индексации ...

+0

Спасибо за вашу помощь – arandomlypickedname

0

Предполагая, что мы сохраняем наш кадр данных в имени переменной - я буду называть его dataframe сейчас - следующие должны это сделать:

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

Где, конечно <whatever> является номер, который вы хотите использовать для Qn.number.

+1

Вам не нужен вызов 'which'; логическое индексирование в порядке. –

+0

Huh ... так и есть. Спасибо, что указали это! –

+2

Другой вариант: 'dataframe [dataframe $ QN.number ==" QN2200 "," Allele.Y.Rn "]'. –

4

Использовать subset.

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

with обеспечивает альтернативу; здесь вывод представляет собой вектор, а не другой кадр данных.

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

Я могу получить подмножество для работы с ограниченным набором тестовых данных, которые я предоставил, но я не могу заставить его работать над реальным набором данных: страшные «неопределенные столбцы выбраны» ошибка – arandomlypickedname

Смежные вопросы