根据R中的第一次和最后一次出现折叠观察行
我有一个这样的数据集根据R中的第一次和最后一次出现折叠观察行,r,R,我有一个这样的数据集 ID EQP_ID DATE ENTRY EXIT 10 1232 10/01/2018 0058 NA 10 8123 10/01/2018 NA 0059 11 8231 10/02/2018 0063 NA 11 233
ID EQP_ID DATE ENTRY EXIT
10 1232 10/01/2018 0058 NA
10 8123 10/01/2018 NA 0059
11 8231 10/02/2018 0063 NA
11 233 10/03/2018 0064 NA
11 2512 10/04/2018 NA 0099
11 2111 10/05/2018 NA 1000
我希望折叠观察结果,以便我看到的具有给定ID的“条目”的最早行与具有退出值的最新行组合,并且我还获得与退出记录关联的EQP_ID:
ID EQP_ID ENTRY EXIT
10 8123 0058 0059
11 2111 0063 1000
我对R相当陌生,这非常复杂,以至于我想不出一个不使用循环的好方法来实现它,而且可以预见性能不是很好
编辑
我想这就行了,但我还是很好奇其他更有经验的人是否有更好的答案
> group_by(dataset, ID) %>%
arrange(ENTRY) %>%
summarize(ENTRY = first(ENTRY), EXIT = last(exit), EQP_ID = last(EQP_ID))
带有data.table的一个选项:
library(data.table)
#create example data
dt <- data.table(
id = c(10, 10, 11, 11, 11, 11),
date = seq(as.Date("2018-10-1"), as.Date("2018-10-6"), by="day"),
entry = c(58, NA, 63, 64, NA, NA),
exit = c(NA, 59, NA, NA, 99, 100)
)
# number rows by id
dt[order(id, date), num := 1:.N, by=id]
# get first-entry and last-exit values by id
dt[ , keepentry := entry[1],by=id]
dt[ , keepexit := exit[.N],by=id]
# keep one row per id
dt[num==1, .(id, keepentry, keepexit)]
库(data.table)
#创建示例数据
dt使用dplyr::first
和dplyr::last
我们可以执行以下操作,我们可以使用min
和max
library(dplyr)
df %>% group_by(ID) %>%
summarise(EQP_ID=dplyr::last(EQP_ID), First=dplyr::first(ENTRY),Last=dplyr::last(EXIT))
# A tibble: 2 x 4
ID EQP_ID First Last
<int> <int> <int> <int>
1 10 8123 58 59
2 11 2111 63 1000
库(dplyr)
df%%>%分组依据(ID)%%>%
总结(EQP_ID=dplyr::last(EQP_ID),First=dplyr::First(进入),last=dplyr::last(退出))
#一个tibble:2x4
ID设备ID第一个最后一个
1 10 8123 58 59
2 11 2111 63 1000
此解决方案使用dplyr
。首先,定义数据帧
df <- read.table(text = "ID EQP_ID DATE ENTRY EXIT
10 1232 10/01/2018 0058 NA
10 8123 10/01/2018 NA 0059
11 8231 10/02/2018 0063 NA
11 233 10/03/2018 0064 NA
11 2512 10/04/2018 NA 0099
11 2111 10/05/2018 NA 1000", header = TRUE)
这就给,
# # A tibble: 2 x 4
# ID EQP_ID ENTRY EXIT
# <int> <int> <int> <int>
# 1 10 8123 58 59
# 2 11 2111 63 1000
##一个tible:2x4
#ID设备\u ID出入口
#
# 1 10 8123 58 59
# 2 11 2111 63 1000
非常感谢!看起来几乎和我同事帮我想出的一模一样。
# # A tibble: 2 x 4
# ID EQP_ID ENTRY EXIT
# <int> <int> <int> <int>
# 1 10 8123 58 59
# 2 11 2111 63 1000