R从数据框中选择:按日期重复因子

时间:2016-02-04 16:57:05

标签: r dplyr

我有一个地址和销售日期的数据框。某些地址有多个条目。我想要一个新的数据框,每个地址只有一次,并且该地址可以在最近的日期之前选择。这是数据框的片段。

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

我只想在新数据框中找到123 Main St的2005日期行。

我尝试了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 个答案:

答案 0 :(得分: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))

或另一种选择是使用top_n

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

如果我们使用data.table,我们会将'data.frame'转换为'data.table'(setDT(df)),按降序排序'sold',并使用{{1}使用unique选项为每个“地址”选择第一个观察值。

by

答案 1 :(得分:2)

这是dplyr的另一个选择:

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

这不需要group_by操作。我们通过降序sold对数据进行排序,然后在多个相同条目的情况下仅返回每个地址的第一行。