2016-02-04 2 views
3

У меня есть кадр данных по адресам и датам продажи. Есть несколько записей некоторых адресов. Я хочу, чтобы новый кадр данных имел каждый адрес только один раз и для того, чтобы этот адрес был выбран по самой последней дате. Вот фрагмент кадра данных.R выбрать из фрейма данных: по дате с повторными коэффициентами

df <-structure(list(address = c("2", "316", "647", "6904", "# 5 BENT TREE DR", "# 62 62000 E 440 PL", "# 7 BENT TREE DR", "#1 ARROWHEAD RD", "#1 ECHO DR", "#1 JACKS HIDEAWAY", "#1 JACKS HIDEAWAY", "#1 MARINA DR", "#1 WHITE CHAPEL", "#10 JACKS HIDEAWAY", "#10 PRIVATEER", "#10 SUMMERSIDE", "#102 THE MOORS", "#103 MOORS VIEW", "#108 THE MOORS", "#111 THE MOORS", "#112 THE MOORS", "#116 THE MOORS", "#12 DOGWOOD HOLLOW", "#12 MAINSTAY", "#120 THE MOORS", "#13 DOGWOOD HOLLOW", "#13 MEGHAN COVES", "#14 BEACON HILL", "#14 GRAND JEST", "#14 GRAND JEST"), sold = structure(c(13521, 11373, 13413, 14372, 15044, 14056, 15044, 12712, 12671, 12524, 11071, 11856, 11670, 11754, 12251, 11829, 11465, 12600, 11271, 11624, 11831, 11276, 12724, 14040, 11100, 12678, 12174, 12293, 14546, 11430), class = "Date")), .Names = c("address", "sold"), class = "data.frame", row.names = c(NA, 30L)) 
df 

Например, если

address  date 
123 Main St 2002-03-01 
123 Main St 2005-01-01 

Я просто хочу, 2005 датированную линии 123 Main St в новом кадре данных.

Я попробовал некоторые функции из dplyr

library(plyr) 
library(dplyr) 

> df %>% group_by(address) %>% max(df$sold) 
Error in FUN(X[[i]], ...) : 
    only defined on a data frame with all numeric variables 
> df %>% group_by(address) %>% max(as.numeric(.(sold))) 
Error in function_list[[k]](value) : 
    (list) object cannot be coerced to type 'double' 

> ddply(df, .(address), max(.(sold))) 
Error in max(.(sold)) : invalid 'type' (list) of argument 

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

ответ

2

Мы можем arrange колонку «продано» в порядке убывания и выбрать первое наблюдение с slice после группировки по «адресу».

library(dplyr) 
df %>% 
    group_by(address) %>% 
    arrange(desc(sold)) %>% 
    slice(1) 

Или получить индекс максимального значения 'продано' (which.sold) и использовать slice, чтобы получить эту строку после того как мы группа по 'адресу'

df %>% 
    group_by(address) %>% 
    slice(which.max(sold)) 

Or другой вариант использует top_n.

df %>% 
    group_by(address) %>% 
    top_n(1) 

Или, если мы используем data.table, мы преобразовать 'data.frame' в 'data.table' (setDT(df)), заказать 'продаются' в убывающем и использовать unique с опцией by выбрать первое наблюдение для каждого «адреса».

library(data.table) 
unique(setDT(df)[order(-sold)], by = 'address') 
+1

Я ценю ваш полный список опций. Отлично. – shea

2

Вот еще один вариант с dplyr:

arrange(df, desc(sold)) %>% distinct(address) 

Это не требует group_by операции. Мы заказываем данные по убыванию sold, а затем возвращаем только первую строку на адрес в случае нескольких одинаковых записей.

+1

Ваш ответ заключается в том, как я мог бы представить решение. Благодарю. – shea

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