2011-02-01 3 views
4

Кажется, что тривиальная задача выбора строк в кадре данных и последующего их упорядочения ускользает от меня и одновременно сводит меня с ума. Например, позволяет иметь тривиальный кадр данных:Выбор строк и упорядочение результата в R

country = c("US", "US", "CA", "US") 
company = c("Apple", "Google", "RIM", "MS") 
vals = c(100, 70, 50, 90) 
df <- data.frame(country, company, vals) 

Позволяет заказать его вальсом

> df[order(vals),] 
    country company vals 
3  CA  RIM 50 
2  US Google 70 
4  US  MS 90 
1  US Apple 100 

отлично работает. Теперь попробуйте выбрать только американские компании и заказать там значения. Мы получаем некоторый фиктивный результат.

> df[country=="US", ][order(vals),] 
    country company vals 
4  US  MS 90 
2  US Google 70 
NA <NA> <NA> NA 
1  US Apple 100 

Позволяет заказать, а затем выбрать. Опять же, фальшивый результат

> df[order(vals),][country=="US", ] 
    country company vals 
3  CA  RIM 50 
2  US Google 70 
1  US Apple 100 

Как получить кадр данных, который включает в себя только американские компании, и отсортированный по Валу?

+0

Удалите переменные, используемые для создания 'df', прежде чем вы начнете делать это, так как они будут найдены не в' df'. Это не решает проблему, но поможет ... –

+1

http://www.ats.ucla.edu/stat/r/faq/sort.htm –

ответ

6

Не уверен, что вы можете сделать это с помощью набора подмножеств вызовов до [, так как вам нужно обратиться к упорядоченному или уменьшенному кадру данных во время второго вызова подмножества. Один из способов сделать заказ данных и предоставить это subset() выбрать строки из этого заказанного кадра данных:

> with(df, subset(df[order(vals),], subset = country == "US")) 
    country company vals 
2  US Google 70 
4  US  MS 90 
1  US Apple 100 
+0

+1 Я всегда предпочитаю подход подмножества. Небольшое упрощение - вам не нужно говорить 'subset =' внутри 'subset()' call. –

+3

Я всегда с осторожностью отношусь к позиционному сопоставлению, особенно при демонстрации кода или написании воспроизводимого кода для моей работы, потому что если я в приведенном выше примере напишу 'subset = FOO', я, очевидно, хотел использовать' subset', а не какой-либо другой аргумент , Итак, вы правы, я не нуждаюсь в этом, чтобы сказать это, но я считаю, что это безопаснее, на всякий случай. –

1
> df[df$country=="US",][order(df[df$country=="US","vals"]),] 
    country company vals 
2  US Google 70 
4  US  MS 90 
1  US Apple 100 

Я думаю, что это хорошая привычка, чтобы удалить исходные переменные и просто работать с dataframe (так ДФОМ $ страны вместо страны).

+0

Это работает, но вы, по сути, выполняете ' country == "US" 'подмножество дважды. Было бы проще сделать эти два действия отдельно, особенно если вычисляемая стоимость 'country == 'US' 'высока для реальных данных, например:' tmp <- df [order (df $ vals),] ' за которым следует 'tmp [tmp $ country ==" US ",]'. Замените 'tmp' на' df', если шаг переупорядочения не является вредным. –

+0

Согласен, и я сначала написал ваш точный двухслойный. По какой-то причине я решил объединить шаги. Мне нравится ваше решение лучше. – ncray

6

Я всегда находил это странным, что база R не имеет удобства для переназначения кадра данных, как это делается для подмножества. Поэтому я написал (а):

library(plyr) 
arrange(subset(df, country == "US"), vals) 
Смежные вопросы