比方说,我有一个数据帧有几行类似如下:选择值按行根据排名日期间
df <- data.frame(a = c(NA,20,NA),
date1 = c("2016-03-01", "2016-02-01", "2016-02-01"),
b = c(50,NA, NA),
date2 = c("2016-02-01", "2016-03-01", "2016-03-01"),
c = c(10,10, 10),
date3 = c("2016-01-01","2016-01-01", "2016-01-01"))
对于每一行,我想这不是一个NA
最新值在a
,b
,c
之间根据dates
(所以我分别看date1
,date2
或date3
并选择最近的一个)。
基本上,date1
给出对应于值a
, date2
日期给出对应于值b
日期, date3
给出对应于值c
的日期。
如果date1 > date2
& date1 > date3
,我将要采取的价值a
然而,如果该值a
是NA
(这是在我的例子的情况下),我会比较date2
和date3
。在我的示例中,date2 > date3
以及因为值b
不是NA
而是50
,因此我将采用50
作为我的最终结果。
现在我想既然我使用dplyr
在我的数据帧
所有行做到这一点,我尝试使用排序功能(在我的例子使用case_when
功能,我期待一个第一排日期,然后看链接的价值。如果它是一个不适用的,我看看排名第二的等等......)
但是,我不能只是说,因为我想要做的, :
df <- df %>%
mutate(result = case_when(is.na(a) & is.na(b) & is.na(c) ~ NA_integer_,
rev(rank(date1, date2, date3))[1] == 3 & !is.na(a) ~ a,
rev(rank(date1, date2, date3))[2] == 3 & !is.na(b) ~ b,
rev(rank(date1, date2, date3))[3] == 3 & !is.na(a) ~ c,
rev(rank(date1, date2, date3))[1] == 2 & !is.na(a) ~ a,
rev(rank(date1, date2, date3))[2] == 2 & !is.na(b) ~ b,
rev(rank(date1, date2, date3))[3] == 2 & !is.na(a) ~ c,
rev(rank(date1, date2, date3))[1] == 1 & !is.na(a) ~ a,
rev(rank(date1, date2, date3))[2] == 1 & !is.na(b) ~ b,
rev(rank(date1, date2, date3))[3] == 1 & !is.na(a) ~ c))
因为rank
功能需要一个独特的向量作为参数(但我不能把c(date1, date2, date3)
既不会因为它会给我这个向量的整个秩序,而不是每行的秩序)
在我的例子中,我想要的结果将是
res
a date1 b date2 c date3 result
NA 2016-03-01 50 2016-02-01 10 2016-01-01 50
20 2016-02-01 NA 2016-03-01 10 2016-01-01 20
NA 2016-02-01 NA 2016-03-01 10 2016-01-01 10
有没有人有一个想法,甚至完全不同的方法来解决这个问题?
谢谢!由于使用data.table对象,算法的速度令我印象深刻 – MBB