我有一个数据集,其中每个人(id)都有一个e_date,并且因为每个人都可以拥有多个e_date,所以我试图获得每个人的最早日期.所以基本上我想有一个数据集,每个id每行显示一行,显示他最早的e_date值.我使用聚合函数来查找最小值,我创建了一个组合日期和id的新变量,最后我使用创建的新变量基于包含最小值的原始数据集进行子集化.我来这个:
new <- aggregate(e_date ~ id, data_full, min)
data_full["comb"] <- NULL
data_full$comb <- paste(data_full$id,data_full$e_date)
new["comb"] <- NULL
new$comb <- paste(new$lopnr,new$EDATUM)
data_fixed <- data_full[which(new$comb %in% data_full$comb),]
Run Code Online (Sandbox Code Playgroud)
第一件事是聚合函数似乎根本不起作用,它减少了行数但查看数据我可以清楚地看到一些id出现不同的e_date不止一次.另外,当我使用as.Date格式而不是日期(整数)的原始格式时,代码给出了不同的结果.我认为答案很简单,但我很震惊.
akr*_*run 12
我们可以用data.table.将'data.frame'转换为'data.table'(setDT(data_full)),按'id'分组,我们得到第1行(head(.SD, 1L)).
library(data.table)
setDT(data_full)[order(e_date), head(.SD, 1L), by = id]
Run Code Online (Sandbox Code Playgroud)
或者dplyr,在使用'id'分组后,arrange使用'e_date'(假设它是Date类)并获取第一行slice.
library(dplyr)
data_full %>%
group_by(id) %>%
arrange(e_date) %>%
slice(1L)
Run Code Online (Sandbox Code Playgroud)
如果我们需要一个base R选项,ave可以使用
data_full[with(data_full, ave(e_date, id, FUN = function(x) rank(x)==1)),]
Run Code Online (Sandbox Code Playgroud)
小智 8
使用 dplyr 的 filter 命令的另一个答案:
dta %>%
group_by(id) %>%
filter(date == min(date))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7439 次 |
| 最近记录: |