簡體   English   中英

如何在有條件的 R 中聚合

[英]How to aggregate in R with conditions

x <- data.frame(names=c("peter","peter", "jacob", "jacob"),
            some_score =c(5,8,6,8),
            xDate = as.Date(c("2018-01-01", "2019-01-01" , "2018-06-08", 
"2019-10-22"))

)

在這個 dataframe 中需要匯總,所以我得到每個名字的最新分數(彼得 = 8 和雅各布 = 8)

有沒有快速的方法來做到這一點? 現在我正在創建兩個聚合數據框並將它們鏈接起來。 但這似乎效率低下

我們可以得到每個names的最大xDate行。

這可以使用dplyr來完成

library(dplyr)
x %>% group_by(names) %>% slice(which.max(xDate))

#  names  some_score  Date     
#   <chr>      <dbl> <date>    
#1 jacob          8 2019-10-22
#2 peter          8 2019-01-01

data.table

library(data.table)
setDT(x)[, .SD[which.max(xDate)], names]
> aggregate(x,list(x$names),tail,1)
  Group.1 names some_score      xDate
1   jacob jacob          8 2019-10-22
2   peter peter          8 2019-01-01

假設您的 dataframe 已排序,否則先按時間排序。

另一種解決方案:

library(magrittr)

x %>% 
  dplyr::group_by(names) %>% 
  dplyr::filter(xDate == max(xDate))

底座R 一個內膽:

data.frame(do.call("rbind", lapply(split(x, x$names), function(x){x[which.max(x$xDate),]})), 
           row.names = NULL)

dplyr package 是您的問題的絕佳選擇。

x <- data.frame(names=c("peter","peter", "jacob", "jacob"),
                some_score =c(5,8,6,8),
                xDate = as.Date(c("2018-01-01", "2019-01-01" , "2018-06-08", 
                                  "2019-10-22")))
library(dplyr)
x %>% 
  group_by(names) %>% 
  summarise(max_some_score = max(some_score))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM