选择日期变量的最后一次观察 - SPSS 或 R 基础 R

问题描述

我对 R 比较陌生,所以我意识到这类问题经常被问到,但我已经阅读了很多堆栈溢出的帖子,但仍然不能完全解决我的数据问题。

我在导入到 R 的两个数据集中有关于 spss 的数据。我的两个数据集都包含一个 id (IDC),我一直用它来合并它们。在合并之前,我需要过滤其中一个数据集以专门选择日期变量的最后一次观察。

我的数据集 d1 具有长格式的纵向度量。每个IDC有多行,代表不同的居住地(邻里)。每行都有自己的“start_date”,这是一个不一定唯一的变量。

它在spss上的样子:

IDC 邻里 开始日期
1 22 08.07.2001
1 44 04.02.2005
1 13 21.06.2010
2 44 24.12.2014
2 3 06.03.2002
3 22 04.01.2006
4 13 08.07.2001
4 2 15.06.2011

在 R 中,开始日期看起来不一样,而是像“13529462400”这样的一个长数字。我不明白这种格式,但我认为它仍然会保留日期顺序...

这是迄今为止我选择最后日期的所有尝试。所有尝试都运行了,没有错误输出只是没有给我我想要的。在我看来,这些都没有改变 IDC 的重复次数,所以实际上没有一个选择*仅最后一个日期。

##### attempt 1 --- not working
d1$start_date_filt <- d1$start_date
d1[order(d1$IDC,d1$start_date_filt),]  # Sort by ID and week
d1[!duplicated(d1$IDC,fromLast=T),] # Keep last observation per ID)

###### attempt 2--- not working 
myid.uni <- unique(d1$IDC)
a<-length(myid.uni)

last <- c()

for (i in 1:a) {
  temp<-subset(d1,IDC==myid.uni[i])
  if (dim(temp)[1] > 1) {
    last.temp<-temp[dim(temp)[1],]
  }
  else {
    last.temp<-temp
  }
  last<-rbind(last,last.temp)
}

last

##### atempt 3 -- doesn't work

do.call("rbind",by(d1,INDICES = d1$IDC,FUN=function(DF)
      DF[which.max(DF$start_date),]))

#### attempt 4 -- doesnt work 
library(plyr)
ddply(d1,.(IDC),function(X)
  X[which.max(X$start_date),])

### merger code -- in case something has to change with that after only the last start_date is selected
merge(d1,d2,IDC)

我的目标数据集 d1 如下所示:

IDC 邻里 开始日期
1 13 21.06.2010
2 44 24.12.2014
3 22 04.01.2006
4 2 15.06.2011

我很感激任何帮助,非常感谢

解决方法

大多数处理这些数据的方法都存在一些问题:因为您的日期是排序不正确的格式的任意字符串,所以在这里工作是偶然的,因为最大的月份也发生在最大年份。

通常最好将该列用作 R 中的 Date 对象,以便更好地进行比较。

dat$start_date <- as.Date(dat$start_date,format = "%d.%m.%Y")
dat
#   IDC neighborhood start_date
# 1   1           22 2001-07-08
# 2   1           44 2005-02-04
# 3   1           13 2010-06-21
# 4   2           44 2014-12-24
# 5   2            3 2002-03-06
# 6   3           22 2006-01-04
# 7   4           13 2001-07-08
# 8   4            2 2011-06-15

从这里开始,事情变得更简单了:

基础 R

do.call(rbind,by(dat,dat[,c("IDC"),drop=FALSE],function(z) z[which.max(z$start_date),]))
#   IDC neighborhood start_date
# 1   1           13 2010-06-21
# 2   2           44 2014-12-24
# 3   3           22 2006-01-04
# 4   4            2 2011-06-15

dplyr

dat %>%
  group_by(IDC) %>%
  slice(which.max(start_date)) %>%
  ungroup()
# # A tibble: 4 x 3
#     IDC neighborhood start_date
#   <int>        <int> <date>    
# 1     1           13 2010-06-21
# 2     2           44 2014-12-24
# 3     3           22 2006-01-04
# 4     4            2 2011-06-15

数据

dat <- structure(list(IDC = c(1L,1L,2L,3L,4L,4L),neighborhood = c(22L,44L,13L,22L,2L),start_date = c("08.07.2001","04.02.2005","21.06.2010","24.12.2014","06.03.2002","04.01.2006","08.07.2001","15.06.2011")),class = "data.frame",row.names = c(NA,-8L))