2015-02-17 5 views
2

У меня довольно большой фрейм данных с коэффициентом, который имеет много уровней (более 4000). У меня есть другой столбец в том же фрейме данных, который я использую в качестве ссылки, и то, что я хотел бы найти, является подмножеством уровней, когда этот ссылочный столбец равен NA.R - показывать только уровни, используемые в подмножестве кадра данных

Первый шаг, который я использую, - subsetrows <- which(is.na(mydata$reference)), но после этого я застрял. Я хочу что-то вроде levels(mydata[subsetrows,mydata$factor]), но, к сожалению, эта команда показывает мне все уровни, а не только те, что есть в subsetrows. Я полагаю, что я мог бы создать новый вектор за пределами моего фрейма данных только из моих строк подмножества, а затем удалить любые неиспользуемые уровни, но есть ли способ сделать это проще или чище, возможно, без копирования моих данных за пределы фрейма данных?

В качестве примера того, что я хочу вернуть, если в моем кадре данных есть уровни факторов от А до Я, но в моем подмножестве появляются только P, R и Y, я хочу что-то, что возвращает уровни P, R и Y.

+0

Возможно, это может помочь http://stackoverflow.com/questions/1195826/dropping-factor-levels-in-a-subsetted-data-frame-in-r – NicE

+2

Не могли бы вы попробовать 'levels (mydata $ factor) [ MYDATA $ фактор [subsetrows]] '? –

+2

Ну, используя вашу предыдущую идею 'unique', это дает мне правильные уровни:' unique (as.character (mydata $ factor [subsetrows])) ' –

ответ

0

Я изменил предложение в комментариях Марата использовать функцию unique, которая, кажется, чтобы вернуться правильные уровни.

Решение:

subsetrows <- which(is.na(mydata$reference)) 
unique(as.character(mydata$factor[subsetrows])) 

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

1

Вы можете сделать это с помощью функций base. Но мое личное предпочтение использовать dplyr с прикованными такими операциями, как это: данные

library(dplyr) 

d %>% 
    filter(is.na(ref)) %>% 
    select(field) %>% 
    distinct() 

d <- data.frame(
    field = c("A", "B", "C", "A", "B", "C"), 
    ref = c(NA, "a", "b", NA, "c", NA) 
) 
+0

Что делает этот оператор%>%? –

+0

Это оператор прямого трубопровода из [magrittr] (https://github.com/smbache/magrittr). В основном 'x%>% f()' эквивалентно 'f (x)'. –

+0

Итак ... что было бы эквивалентно помещению 'd $ ref' в строку' filter', а затем поместить результат в строку 'select', а затем результат этого в строке' distinct'? –

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

  • Нет связанных вопросов^_^