在R中的每一行中查找最早和最晚的日期
我有超过400列的大型数据集,代表在线平台上的某些用户输入元素以及每次输入发生的时间。每行代表一个用户ID 其中200列属于POSIXct POSIXt类,例如2019-11-04 15:33:50,可能会出现缺失值,因为并非每个用户都会显示或填写每个元素 我的目标是创建两个额外的列,其中包括200个POSIXct POSIXt列中每行的最早日期和最晚日期 这里是框架的简化示例和所需的附加柱之一。 ID4将是一个从不费心打开侧边的人,但是拥有来自其他数据源的数据,并且现在应该保留在数据集中在R中的每一行中查找最早和最晚的日期,r,date,time,lubridate,posixct,R,Date,Time,Lubridate,Posixct,我有超过400列的大型数据集,代表在线平台上的某些用户输入元素以及每次输入发生的时间。每行代表一个用户ID 其中200列属于POSIXct POSIXt类,例如2019-11-04 15:33:50,可能会出现缺失值,因为并非每个用户都会显示或填写每个元素 我的目标是创建两个额外的列,其中包括200个POSIXct POSIXt列中每行的最早日期和最晚日期 这里是框架的简化示例和所需的附加柱之一。 ID4将是一个从不费心打开侧边的人,但是拥有来自其他数据源的数据,并且现在应该保留在数据集中 ID
ID Other_columns date_column date_column2 date_column3 max_date (what I want)
1 "numeric" 2019-11-04 19:33:50 2019-11-05 15:33:50 2019-11-05 16:33:50 2019-11-05 16:33:50
2 "numeric" NA 2019-11-04 17:20:10 2019-11-09 19:12:50 2019-11-09 19:12:50
3 "numeric" 2019-11-07 20:33:50 NA 2019-11-04 18:31:50 2019-11-07 20:33:50
4 NA NA NA NA NA
到目前为止,我并没有进一步过滤掉其他非日期列
is.POSIXt <- function(x) inherits(x, "POSIXt")
df%>%select(where(is.POSIXt))
而不是选择,我可能应该使用一个变异的或什么作为条件,
但是,最好的方法是检查所有剩余的200个日期/时间列,然后将最早/最晚日期分配给新创建的列,同时忽略NA值。我们可以在“日期”列上使用pmax和pmin来返回每行的最早和最晚日期
library(dplyr)
df %>%
mutate(max_date = do.call(pmax, c(select(., starts_with('date')), na.rm = TRUE)),
min_date = do.call(pmin, c(select(., starts_with('date')),
na.rm = TRUE)))
# ID Other_columns date_column date_column2 date_column3 max_date min_date
#1 1 numeric 2019-11-04 19:33:50 2019-11-05 15:33:50 2019-11-05 16:33:50 2019-11-05 16:33:50 2019-11-04 19:33:50
#2 2 numeric <NA> 2019-11-04 17:20:10 2019-11-09 19:12:50 2019-11-09 19:12:50 2019-11-04 17:20:10
#3 3 numeric 2019-11-07 20:33:50 <NA> 2019-11-04 18:31:50 2019-11-07 20:33:50 2019-11-04 18:31:50
#4 4 <NA> <NA> <NA> <NA> <NA> <NA>
-输出
# A tibble: 4 x 7
# Rowwise:
# ID Other_columns date_column date_column2 date_column3 max_date min_date
# <int> <chr> <chr> <chr> <chr> <dttm> <dttm>
#1 1 numeric 2019-11-04 19:33:50 2019-11-05 15:33:50 2019-11-05 16:33:50 2019-11-05 16:33:50 2019-11-04 19:33:50
#2 2 numeric <NA> 2019-11-04 17:20:10 2019-11-09 19:12:50 2019-11-09 19:12:50 2019-11-04 17:20:10
#3 3 numeric 2019-11-07 20:33:50 <NA> 2019-11-04 18:31:50 2019-11-07 20:33:50 2019-11-04 18:31:50
#4 4 <NA> <NA> <NA> <NA> NA NA NA NA
数据
这里是另一种不用任何包就可以使用的方法 首先,获取日期列的数据,从中可以对每一行使用apply函数来获取相应的最大值和最小值。以下是一个例子:
df_date = df[, sapply(df, FUN = function(x) class(x)[1]) %in% c("POSIXct", "POSIXt")]
df$max = apply(df_date, 2, FUN = function(x) max(x, na.rm = TRUE)
df$min = apply(df_date, 2, FUN = function(x) min(x, na.rm = TRUE)
资料
有几个帖子应该会有帮助:,,还有一个很好的衡量标准:我建议四处寻找使用pmax或pmin功能的帖子。您使用更新的where select助手的想法似乎也不错
df <- structure(list(ID = 1:4, Other_columns = c("numeric", "numeric",
"numeric", NA), date_column = c("2019-11-04 19:33:50", NA, "2019-11-07 20:33:50",
NA), date_column2 = c("2019-11-05 15:33:50", "2019-11-04 17:20:10",
NA, NA), date_column3 = c("2019-11-05 16:33:50", "2019-11-09 19:12:50",
"2019-11-04 18:31:50", NA)), class = "data.frame", row.names = c(NA,
-4L))
df_date = df[, sapply(df, FUN = function(x) class(x)[1]) %in% c("POSIXct", "POSIXt")]
df$max = apply(df_date, 2, FUN = function(x) max(x, na.rm = TRUE)
df$min = apply(df_date, 2, FUN = function(x) min(x, na.rm = TRUE)
structure(list(ID = 1:4, Other_columns = c("numeric", "numeric",
"numeric", NA), date_column = structure(c(1572876230, NA, 1573139030,
NA), class = c("POSIXct", "POSIXt"), tzone = ""), date_column2 = structure(c(1572948230,
1572868210, NA, NA), class = c("POSIXct", "POSIXt"), tzone = ""),
date_column3 = structure(c(1572951830, 1573306970, 1572872510,
NA), class = c("POSIXct", "POSIXt"), tzone = "")), class = "data.frame", row.names = c(NA,
-4L))