[英]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.