我有一个类似于以下示例的data.frame:
DF1 <- data.frame(
date.1 = c('2012-05-13','2012-02-09','2013-05-20'),
date.2 = c('2011-01-01','2012-07-16','2013-09-09'),
date.3 = c('2012-05-13','2011-03-11','2014-03-10'),
date.test = c('2014-05-13','2010-05-13','2012-04-13'))
实际上,有数百个日期字段。对于data.frame中的每一行,我想将所有日期字段与date.test中的值进行比较,如果任何日期大于date.test,则应返回单个值TRUE或1。
所以上面的例子应该返回FALSE,TRUE,TRUE
我试过
DF1[,1:3] > DF1$date.test
并获得各种错误
为我指出正确的方向干杯
另外澄清一下,由于原始发布我设法解决了以下问题:
DF1$answer <- DF1$date.1>DF1$date.test | DF1$date.2>DF1$date.test | DF1$date.3>DF1$date.test
但是,如果我必须为150多个日期字段执行此操作,那将非常笨重。有更优雅的解决方案吗?
答案 0 :(得分:0)
在进行任何比较之前,我们需要将factor
类转换为Date
类。循环遍历数据集列(lapply(..
)可以转换为Date
类。这里很容易,因为format
与Date
类格式相同,所以只需使用as.Date
并将输出分配回原始数据集。
DF1[] <- lapply(DF1, as.Date)
现在,对等大小的数据集进行比较。复制第4列以使长度与前3列相同。在这里,我们使用col(DF1[1:3])
),以便由此返回的索引将使最后一列元素复制。
i1 <- DF1[1:3] > DF1[4][col(DF1[1:3])]
i1
# date.1 date.2 date.3
#[1,] FALSE TRUE TRUE
#[2,] FALSE TRUE FALSE
#[3,] FALSE TRUE TRUE
我们可以通过获取列总和(vector
)并检查它是否大于0来将逻辑矩阵转换为逻辑colSums
。
DF1$answer <- unname(colSums(i1)>0)
DF1$answer
$[1] FALSE TRUE TRUE