R - 比较数据框中多列的逻辑测试

时间:2017-03-22 05:10:31

标签: r data-science

我有一个类似于以下示例的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多个日期字段执行此操作,那将非常笨重。有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:0)

在进行任何比较之前,我们需要将factor类转换为Date类。循环遍历数据集列(lapply(..)可以转换为Date类。这里很容易,因为formatDate类格式相同,所以只需使用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