比较行中的日期并删除冲突

问题描述 投票:0回答:1

我有一个带有id的数据帧,以及三个日期列,每行应该相同,但有时会发生冲突。

对于每一行,我想比较三个日期,如果至少有两个同意然后把那个日期,但如果所有不同意,那么把NA。

由于还有未知日期的NA,因此稍微复杂一些。如果有两个NA和一个日期,我很乐意保留这个日期。

我可以用一堆ifelse来做到这一点,但是想知道是否有一种巧妙的方法。

问题的一个例子是这个数据帧:

dataDF <- data.frame(
  id = c(1,2,3,4,5,6),
  date1 = as.Date(c('2000-01-01', '2000-05-01', NA,            NA,          '2000-01-05', NA)),
  date2 = as.Date(c('2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04', '2000-01-06', NA)),
  date3 = as.Date(c(NA,           '2000-01-02', '2000-05-03',  NA         , '2000-01-07', NA))

)

我想最终得到一个新的干净的date列,以便数据框如下所示:

  id      date1      date2      date3       date
1  1 2000-01-01 2000-01-01       <NA> 2000-01-01
2  2 2000-05-01 2000-01-02 2000-01-02 2000-01-02
3  3       <NA> 2000-01-03 2000-05-03       <NA>
4  4       <NA> 2000-01-04       <NA> 2000-01-04
5  5 2000-01-05 2000-01-06 2000-01-07       <NA>
6  6       <NA>       <NA>       <NA>       <NA>

提前致谢

r date data-cleaning
1个回答
1
投票

这有效。

说明: 这个函数的工作方式如下: 1.对于每一行,如果所有值都是NA,则返回NA 2.对于每一行,如果所有值都是唯一的,则返回NA。 3.如果一行中有2个NA,则返回非NA值。 4.否则,它返回两次出现的值之一。

# helper function
get_values <- function(x)
{
    if (all(is.na(x)) | length(unique(x)) == 3) return (NA)
    else if ((length(unique(x)) == 1) & (! any(is.na(x)))) return (unique(x))
    else if (sum(is.na(x)) == 2) return (x[!is.na(x)])
    else return(as.character(x[duplicated(x)]))

}


# apply function row wise
dataDF$date <- apply(dataDF[,-1], 1, get_values)

  id      date1      date2      date3       date
1  1 2000-01-01 2000-01-01       <NA> 2000-01-01
2  2 2000-05-01 2000-01-02 2000-01-02 2000-01-02
3  3       <NA> 2000-01-03 2000-05-03       <NA>
4  4       <NA> 2000-01-04       <NA> 2000-01-04
5  5 2000-01-05 2000-01-06 2000-01-07       <NA>
6  6       <NA>       <NA>       <NA>       <NA>
© www.soinside.com 2019 - 2024. All rights reserved.