R语言中计算受试者测试平均日期时序列号日期转换失败
问题:日期数据集平均日期计算异常
我正在处理一份格式较杂乱的日期数据集:约3000名受试者每人对应一行数据,2-11列代表10类测试的完成日期,每位受试者在3-4年内完成1-10次测试(同一日期可完成多次测试)。我已通过以下代码成功计算出每位受试者的最晚测试日期:
qstdates$max_date <- apply(qstdates, 1, function(x) max_(c(x[2:11]))) qstdates$max_date <- as.Date(qstdates$max_date)
其中qstdates为数据集。尝试修改代码计算每位受试者的平均测试日期时,采用了以下两种方式:
qstdates$avg_date <- apply(sapply(qstdates[2:11], as.numeric), 1, function(x) round(mean_(c(x[2:11])))) qstdates$avg_date <- sapply(qstdates$avg_date, as.Date, origin="1970-01-01") ##OR qstdates$avg_date <- round(rowMeans(sapply(qstdates[2:11], as.numeric),na.rm=T)) qstdates$avg_date <- sapply(qstdates$avg_date, as.Date, origin="1970-01-01")
但序列号日期(范围为12719-15460)无法转换为日期格式,运行后结果要么为负数,要么无变化。请问问题出在哪里?
问题排查与解决方法
问题根源
- 索引错误:第一种方法中,
apply的函数参数x已经是每行10个日期的数值向量,却错误取x[2:11],导致丢失第一个数值,计算出的均值并非所有测试日期的平均,得到的序列号偏移量错误,转换为Date时自然异常。 - 函数误用:代码中的
mean_如果是自定义函数未正确处理NA,或是误将base包的mean写成mean_,会导致均值计算结果异常。 - 日期类型未统一:若原数据2-11列是字符型日期而非Date类型,直接用
as.numeric转换会得到NA或错误数值,进而导致均值计算错误,转换Date时出现负数或无变化。
正确实现代码
方法一:先统一日期类型再计算
# 1. 将2-11列转换为Date类型(根据实际日期格式调整format参数,比如"%d/%m/%Y") qstdates[, 2:11] <- lapply(qstdates[, 2:11], as.Date, format = "%Y-%m-%d") # 2. 转换为数值矩阵,计算每行均值(自动忽略NA) avg_num <- rowMeans(as.matrix(qstdates[, 2:11]), na.rm = TRUE) # 3. 将均值数值转回Date格式 qstdates$avg_date <- as.Date(round(avg_num), origin = "1970-01-01")
方法二:用apply一行完成
qstdates$avg_date <- apply(qstdates[, 2:11], 1, function(x) { # 先转数值,计算均值(处理NA),再转回Date as.Date(round(mean(as.numeric(x), na.rm = TRUE)), origin = "1970-01-01") })
内容的提问来源于stack exchange,提问作者jamberhee
相关产品推荐
相关产品推荐

