2016-08-23 177 views
2

我想從多個日期列中獲取每行中具有最早日期的列。R - 如何從日期欄中選擇最早的日期列?

我的數據集是這樣的。

df = data.frame(x_date = as.Date(c("2016-1-3", "2016-3-5", "2016-5-5")) , y_date = as.Date(c("2016-2-2", "2016-3-1", "2016-4-4")), z_date = as.Date(c("2016-3-2", "2016-1-1", "2016-7-1")))

+---+-----------+------------+-----------+ | | x_date | y_date | z_date | +---+-----------+------------+-----------+ |1 | 2016-01-03 | 2016-02-02 |2016-03-02 | |2 | 2016-03-05 | 2016-03-01 |2016-01-01 | |3 | 2016-05-05 | 2016-04-04 |2016-07-01 | +---+-----------+------------+-----------+

我想獲得類似下面列。

+---+---------------+ | | earliest_date | +---+---------------+ |1 | 2016-01-03 | |2 | 2016-01-01 | |3 | 2016-04-04 | +---+---------------+

這是我的代碼,但它輸出從總體列和行的最早日期....

library(dplyr) df %>% dplyr::mutate(earliest_date = min(x_date, y_date, z_date))

回答

5

一種選擇是pmin

df %>% 
    mutate(earliest_date = pmin(x_date, y_date, z_date)) 
# x_date  y_date  z_date earliest_date 
#1 2016-01-03 2016-02-02 2016-03-02 2016-01-03 
#2 2016-03-05 2016-03-01 2016-01-01 2016-01-01 
#3 2016-05-05 2016-04-04 2016-07-01 2016-04-04 

如果我們只需要一列,然後transmute是期權

df %>% 
    transmute(earliest_date = pmin(x_date, y_date,z_date)) 
+1

這就是我想要做的! [pmin()](http://stackoverflow.com/questions/28070878/r-use-min-within-dplyrmutate)我需要使用的功能。非常感謝你。 – Toshihiro

+0

此外,當我嘗試使用pmin()處理缺少值的行時,我需要使用ifelse()來處理NA。但是,在那個時候,Date類自動轉換爲double類型(確切地說,Date類信息已被刪除)。爲了保持Date的類信息,我嘗試了safe.ifelse()提出[這裏](http://stackoverflow.com/questions/6668963/how-to-prevent-ifelse-from-turning-date-objects-into-numeric對象),它工作正常。 – Toshihiro

+0

@Toshihiro'pmin'中有'na.rm'參數。默認情況下,它是'FALSE',即'pmin(x_date,y_date,z_date,na.rm = TRUE)' – akrun

1

可以apply橫行來獲得日期的最小值(因爲日期已經是日期類)

apply(df, 1, min) 

#[1] "2016-01-03" "2016-01-01" "2016-04-04" 

或者你也可以使用pmindo.call

do.call(pmin, df) 

#[1] "2016-01-03" "2016-01-01" "2016-04-04" 
2

你需要,如果你所要的輸出與行列的數據幀轉換數據先設置。

library(reshape2) 
melt(df) %>% group_by(variable) %>% summarize(earliest_date = min(value)) 
+1

謝謝你的提示,我已經忘記了這一點。 –

相關問題