R 在旧数据框中,按两列排序,并将每行的第一行存储到新数据框中
我有一个包含3列的数据框,我想使用列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
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