比较行中的日期并消除冲突
Compare dates in row and remove conflicts
我有一个带有 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>
提前致谢
这有效。
解释:
这个函数是这样工作的:
1.对于每一行,如果所有值都是NA,则returns NA
2. 对于每一行,如果所有值都是唯一的,则 returns NA。
3. 如果连续有 2 个 NA,则 returns 为 non-NA 值。
4. 否则,它是 returns 出现两次的值之一。
# 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>
我有一个带有 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>
提前致谢
这有效。
解释:
这个函数是这样工作的:
1.对于每一行,如果所有值都是NA,则returns NA
2. 对于每一行,如果所有值都是唯一的,则 returns NA。
3. 如果连续有 2 个 NA,则 returns 为 non-NA 值。
4. 否则,它是 returns 出现两次的值之一。
# 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>