R 在旧数据框中,按两列排序,并将每行的第一行存储到新数据框中

R 在旧数据框中,按两列排序,并将每行的第一行存储到新数据框中,r,R,我有一个包含3列的数据框,我想使用列date和location获取每个位置的最新观测值,并将其存储到新的数据框中 > old.data date location amount 2014 NY 1 2015 NJ 2 2016 NY 3 2015 NM 4 2013 NY 5 2014 NJ 6 2016 NM 7 2016 NJ 8 2015 NY 9 > new.data

我有一个包含3列的数据框,我想使用列
date
location
获取每个位置的最新观测值,并将其存储到新的数据框中

> old.data
date location amount
2014 NY       1
2015 NJ       2
2016 NY       3
2015 NM       4
2013 NY       5
2014 NJ       6
2016 NM       7
2016 NJ       8
2015 NY       9

> new.data
date location amount
2016 NJ       8
2016 NM       7
2016 NY       3

使用
dplyr

library(dplyr)

new.data <- old.data %>% arrange(desc(date), location) %>% group_by(location) %>% slice(1)

new.data

Source: local data frame [3 x 2]
Groups: location [3]

   date location
  <int>   <fctr>
1  2016       NJ
2  2016       NM
3  2016       NY
数据

old.data <- structure(list(date = c(2014L, 2015L, 2016L, 2015L, 2013L, 2014L, 
2016L, 2016L, 2015L), location = structure(c(3L, 1L, 3L, 2L, 
3L, 1L, 2L, 1L, 3L), .Label = c("NJ", "NM", "NY"), class = "factor")), .Names = c("date", 
"location"), class = "data.frame", row.names = c(NA, -9L))
按照Arun的建议,使用.SD.SDcols

# adding more data
old.data$amount <- 1:9
old.data$a <- 10:18

# Retain all columns
keep_cols <- colnames(old.data)[-2] # Remove the column which is mentioned in by

setDT(old.data)[order(-date, location), .SD[1L], by = location, .SDcols = keep_cols]

# or assigning colnames to .SDcols directly: 

setDT(old.data)[order(-date, location), .SD[1L], by = location, .SDcols = (colnames(old.data)[-2])]

   location date amount  a
1:       NJ 2016      8 17
2:       NM 2016      7 16
3:       NY 2016      3 12
#添加更多数据
旧的.data$amount这个呢:

library(dplyr)
date <- c(2014, 2015, 2016, 2015, 2013, 2014, 2016, 2016, 2015)
location <- c("NY", "NJ", "NY", "NM", "NY", "NJ", "NM", "NJ", "NY")

old.data <- data.frame(date, location)

new.data <- group_by(old.data, location)

new.data <- summarise(new.data, year = max(date))
库(dplyr)

日期使用
数据。表
数据包:

library(data.table)
setDT(dat)[order(-date), .SD[1L], by = location]
#    location date
# 1:       NY 2016
# 2:       NM 2016
# 3:       NJ 2016

你的data.table解决方案太棒了~比我发现的垃圾快10倍我撒谎了。当我运行几次时,答案实际上非常相似——你的解决方案通常快2-3纳秒。这两个答案都扩展到一个data.frame,其中包含1e6行,性能变化很小。如何在
data.table
函数中更改
new.data
中的日期列名?感谢您的编辑,Arun!我按位置订购以匹配OP.@temporary.Modulation发布的所需输出,Arun的更新代码完美地解决了您的问题。请注意,您也可以直接将
colnames()…
分配给
.SDcols
。我有两个问题:1)如何编辑
data.table
函数以获得正确的列名?2) 如果原始数据框有50列而不是2列,那么这个函数会发生什么变化?测试代码,看看会发生什么——答案应该适用于任何大小的data.table。您可以使用
setnames
功能编辑data.table名称。值得一读data.table包。@temporary.Modulation,start…@Arun谢谢,我没意识到你在关注这些评论!修改了原始帖子以反映增加的数据框维度。您删除了我最喜欢的评论之一:-)
library(dplyr)
date <- c(2014, 2015, 2016, 2015, 2013, 2014, 2016, 2016, 2015)
location <- c("NY", "NJ", "NY", "NM", "NY", "NJ", "NM", "NJ", "NY")

old.data <- data.frame(date, location)

new.data <- group_by(old.data, location)

new.data <- summarise(new.data, year = max(date))
library(data.table)
setDT(dat)[order(-date), .SD[1L], by = location]
#    location date
# 1:       NY 2016
# 2:       NM 2016
# 3:       NJ 2016