根据日期返回列名

时间:2015-10-09 10:45:04

标签: r

我有一个包含大量日期列的数据框,我需要返回包含每行最早日期的列名。

即。如果起始数据是:

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")

3 个答案:

答案 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]