【问题标题】:Select last observation of a date variable - SPSS or R选择日期变量的最后一次观察 - SPSS 或 R
【发布时间】:2021-01-04 21:47:06
【问题描述】:

我对 R 比较陌生,所以我意识到这种类型的问题经常被问到,但我已经阅读了很多堆栈溢出帖子,但仍然无法对我的数据进行处理。

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

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

正如它在 spss 上的样子:

IDC neighborhood start_date
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 的重复次数,所以它们都没有真正选择 *only last date。

##### 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 neighborhood start_date
1 13 21.06.2010
2 44 24.12.2014
3 22 04.01.2006
4 2 15.06.2011

感谢您的帮助,非常感谢

【问题讨论】:

    标签: r spss


    【解决方案1】:

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

    在 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, 1L, 2L, 2L, 3L, 4L, 4L), neighborhood = c(22L, 44L, 13L, 44L, 3L, 22L, 13L, 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))
    

    【讨论】:

    • 您好,感谢您的快速回复!这就是发生的事情。您完全正确地认为日期格式没有被导入 R。因为我的导入(使用外部包)使日期看起来像这样“13529462400”,所以我将导入功能从 Haven 切换为一个。所以最后它看起来是正确的!继续..(pt1)
    • 关于选择最后日期函数,因为我复制了这段代码,所以我一直在尝试修复这个 dplyr 错误 (stackoverflow.com/questions/62842388/dplyr-warns-is-not-empty)。如果我只是卸载包并重新启动,只使用 baseR 脚本,它会一直写“你是否错误地指定了一个参数?”对于我拥有的每一行代码(蓝色!甚至没有错误)哈哈哈我关闭了 R,关闭了我的电脑,再次打开它。当我运行 baseR 解决方案时,仍然有多个 IDC(在上面的示例中,将是多行 IDC 1)和 dplyr 错误...
    • 既然你链接到那个问题(我在那里回答),你有没有尝试过这两个建议?坦率地说,自从github.com/tidyverse/tibble/issues/798#issuecomment-661574331 宣布tibble 的固定版本在 CRAN 上,这是一个有争议的问题。试试install.packages(c("pillar","tibble")),然后重启R,然后再试一次。
    • 抱歉回复延迟。即使我安装了包 tibble,错误仍然存​​在。每次我开始这段代码。我让我的主管运行它,看看是否发生了同样的事情——它没有,一切正常。她保存了一个新版本的代码和工作区,所以现在我终于有了我想要的最后日期的数据集。因此,仅使用 Base R 的第一个代码有效!非常感谢大家的帮助!
    • 如果有,请accept回答。谢谢!很高兴它有效。
    猜你喜欢
    • 2015-10-27
    • 2019-07-19
    • 2020-12-12
    • 2020-09-06
    • 2021-06-27
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多