Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 比较行中的日期并删除冲突_R_Date_Data Cleaning - Fatal编程技术网

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

R 比较行中的日期并删除冲突,r,date,data-cleaning,R,Date,Data Cleaning,我有一个id为的数据框和三个日期列,它们在每一行中应该是相同的,但有时会有冲突 对于每一行,我想比较三个日期,如果至少有两个同意,则输入该日期,如果所有人都不同意,则输入NA 由于也有用于未知日期的NAs,这有点复杂。如果有两个NA和一个日期,我很乐意保留这一个日期 我可以用一堆ifelse来做这件事,但我想知道是否有一种巧妙的方法来做这件事 问题的一个例子是此数据帧: dataDF <- data.frame( id = c(1,2,3,4,5,6), date1 = as.Da

我有一个id为的数据框和三个日期列,它们在每一行中应该是相同的,但有时会有冲突

对于每一行,我想比较三个日期,如果至少有两个同意,则输入该日期,如果所有人都不同意,则输入NA

由于也有用于未知日期的NAs,这有点复杂。如果有两个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))
提前感谢

这很有效

说明:
此函数的工作原理如下:
1.对于每一行,如果所有值均为NA,则返回NA
2.对于每一行,如果所有值都是唯一的,则返回NA
3.如果一行中有2个NAs,则返回非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>
#辅助函数

获取_值,谢谢,但不太有效,如果我有3个相同的值,那么它会在clean列中返回两次。这已经足够近了,所以我们将有一场比赛,希望能得到它谢谢你让我知道。我在函数中添加了另一个case。现在,当所有三个日期相同时,它返回唯一值。
# 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>