比方說,我有一個數據幀有幾行類似如下:選擇值按行根據排名日期間
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