我有一个地址和销售日期的数据框。某些地址有多个条目。我想要一个新的数据框,每个地址只有一次,并且该地址可以在最近的日期之前选择。这是数据框的片段。
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
我不知道该怎么做,并希望能够找到一种方法来选择新的数据框。
答案 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
对数据进行排序,然后在多个相同条目的情况下仅返回每个地址的第一行。