我有一个包含大量日期列的数据框,我需要返回包含每行最早日期的列名。
即。如果起始数据是:
ID date1 date2
1 2015-08-01 2015-07-01
2 2015-07-01 2015-05-01
3 2015-06-01 2015-09-01
然后最终结果应该是:
ID date1 date2 MinDate
1 2015-08-01 2015-07-01 date2
2 2015-07-01 2015-05-01 date2
3 2015-06-01 2015-09-01 date1
这样做的一种手动方式是使用if-else循环,但这是非常手动的。
是否有一种自动化方式,并不意味着必须手动编写所有列名称?在这里手动创建if-else循环对于我拥有的大量列来说是不实际的
示例数据:
df <- data.frame(ID = 1:3,
date1 = c(as.Date("2015-08-01"),as.Date("2015-07-01"),as.Date("2015-06-01")),
date2 = c(as.Date("2015-07-01"),as.Date("2015-05-01"),as.Date("2015-09-01")),
stringsAsFactors = FALSE)
产生上述结果的代码:
df$MinDate <- ifelse(df$date1 < df$date2, "date1", "date2")
答案 0 :(得分:2)
这已被接受,但我会提供一个替代方案,仅用于完成。如果您只比较日期列,则可以执行以下操作:
#a function checking if a column is Date
is.Date <- function(x) inherits(x, 'Date')
#Filter returns a df with the Dates
#and then you choose the min column and return its name
df$MinDate <- apply(Filter(is.Date, df), 1, function(x) names(x[which.min(as.Date(x))]))
输出:
> df
ID date1 date2 MinDate
1 1 2015-08-01 2015-07-01 date2
2 2 2015-07-01 2015-05-01 date2
3 3 2015-06-01 2015-09-01 date1
答案 1 :(得分:1)
a <- array()
for(i in 1:nrow(df))
{
a[i] = which.min(df[i, 2:ncol(df)])
}
a
# [1] 2 2 1
答案 2 :(得分:0)
最好的策略可能是按日期降序排序,然后选择列中的第一行。
df[order(as.Date(df$date,format="%d/%m/%Y")),,drop=FALSE]