Select 日期变量的最后一次观察 - SPSS 或 R
Select last observation of a date variable - SPSS or R
我是 R 的新手,所以我意识到这类问题经常被问到,但我已经阅读了很多关于堆栈溢出的帖子,但仍然无法完全了解我的数据。
我在 spss 上有数据,在导入到 R 的两个数据集中。我的两个数据集都包含一个 id (IDC),我一直用它来合并它们。在合并之前,我需要将其中一个数据集过滤到 select,特别是日期变量的最后一次观察。
我的数据集 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”。我不明白这种格式,但我认为它仍然会保留日期顺序...
这是我迄今为止对 select 最后日期的所有尝试。所有尝试 运行,均未出现错误。输出只是没有给我我想要的。据我所知,其中 none 对 IDC 的重复次数进行了任何更改,因此 none 实际上 select 只编辑了最后一个日期。
##### 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
非常感谢任何帮助,非常感谢 <3
大多数处理此数据的方法都存在一些问题:因为您的日期是格式不正确排序的任意字符串,所以它恰好可以在这里工作,因为最大日期也是发生在最大年份。
在 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 的新手,所以我意识到这类问题经常被问到,但我已经阅读了很多关于堆栈溢出的帖子,但仍然无法完全了解我的数据。
我在 spss 上有数据,在导入到 R 的两个数据集中。我的两个数据集都包含一个 id (IDC),我一直用它来合并它们。在合并之前,我需要将其中一个数据集过滤到 select,特别是日期变量的最后一次观察。
我的数据集 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”。我不明白这种格式,但我认为它仍然会保留日期顺序...
这是我迄今为止对 select 最后日期的所有尝试。所有尝试 运行,均未出现错误。输出只是没有给我我想要的。据我所知,其中 none 对 IDC 的重复次数进行了任何更改,因此 none 实际上 select 只编辑了最后一个日期。
##### 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 |
非常感谢任何帮助,非常感谢 <3
大多数处理此数据的方法都存在一些问题:因为您的日期是格式不正确排序的任意字符串,所以它恰好可以在这里工作,因为最大日期也是发生在最大年份。
在 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))