2015-02-24 2 views
-1

Эй, я только начал изучать R. Я хотел спросить, как я могу найти максимальное значение в векторе, основанном на комбинации двух векторов в кадре данных. Например, я хочу найти пять максимальных средних цен. У меня есть кадр данных с примерно 7 столбцами, 3 из которых являются средней ценой, городом и годом. Год, очевидно, повторяется и варьируется от 2000 до 2009 года. Данные также имеют различные значения NA в разных столбцах и строках.R - максимальные значения

The Data Frame looks something like this: 
avgprice year city 
12   2000 Jersey City 
45   2001 Hoboken 
NA   2000 Hoboken 
34   2000 evanston 
67   2001 abilene 
89   2001 elizabeth 
45   2000 delhi  
98   2000 delhi 

I want the answer to look like 
year city   avgprice 
2000 jersey city  12 
2000 evanston  34 
2000 delhi   98 
2001 hoboken   45 
2001 elizabeth  89 
2001 abilene   67 

Я пробовал использовать следующий код, но я думаю, что я что-то испортил. Я попытался создать df, используя split by year, а затем использовал агрегированную функцию.

df<-split(tx.house.sales, tx.house.sales$year) 
re<-aggregate(avgprice~city, df, FUN=max) 

Спасибо :)

+0

Попробуйте 'совокупный (avgprice ~ город + год, tx.house.sales, функция (х) х [which.max (х) ]) ' –

ответ

3

Вот несколько простых вариантов (при условии, df является оригинала данные (не разделены)). Причина, по которой aggregate работает плавно, заключается в том, что по умолчанию она имеет na.action = na.omit, что соответствует вашим конкретным потребностям.

aggregate(avgprice ~ city + year, df, max) 
#   city year avgprice 
# 1  delhi 2000  98 
# 2 evanston 2000  34 
# 3 Jersey City 2000  12 
# 4  abilene 2001  67 
# 5 elizabeth 2001  89 
# 6  Hoboken 2001  45 

Или

library(data.table) 
setDT(na.omit(df))[, .(avgprice = max(avgprice)), keyby = .(year, city)] 

Или

library(dplyr) 
na.omit(df) %>% 
    group_by(city, year) %>% 
    summarise(avgprice = max(avgprice)) 
+0

Большое вам спасибо .. Также вы можете предложить, что может быть неправильным в следующий код: библиотека (dplyr) df%>% group_by (город, год)%>% do (. [Who.max (. $ Avgprice),]) –

+0

Этот код не является ошибочным. Почему вы говорите, что это неправильно? –

1

Использование dplyr вы можете сделать:

library(dplyr) 
df %>% group_by(city,year) %>% slice(which.max(avgprice)) 

# avgprice year  city 
#1  67 2001 abilene 
#2  98 2000  delhi 
#3  89 2001 elizabeth 
#4  34 2000 evanston 
#5  45 2001 Hoboken 
#6  12 2000 JerseyCity 

Обновлено следующими советами @docendo discimus в

+0

Вы можете использовать' df%>% group_by (city, year)%>% slice (who.max (avgprice)) 'для лучшей производительности –

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