2017-02-06 74 views
0

我有一组列,我需要一个新列min123,这些列的最小值为123a_1123a_5列组中最小的返回值

dff <- structure(list(`MCI ID` = c("070405344", "230349820", "260386435","370390587", "380406805", "391169282", "440377986", "750391394","890373764", "910367024"), 
         `123a_1` = structure(c(16672, 16372,16730, 16688, 16700, 16783, 16709, 17033, 16786, 16675), class = "Date"), 
         `123a_2` = structure(c(17029, 16422, 17088, 17036, 17057,17140, 17072, 17043, 17141, 17038), class = "Date"), 
         `123a_3` = structure(c(NA_real_,NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,NA_real_, NA_real_, NA_real_), class = "Date"), 
         `123a_4` = structure(c(NA_real_,NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,NA_real_, NA_real_, NA_real_), class = "Date"), 
         `123a_5` = structure(c(NA_real_,NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,NA_real_, NA_real_, NA_real_), class = "Date")), 
     .Names = c("MCI ID","123a_1", "123a_2", "123a_3", "123a_4", "123a_5"), row.names = c(NA,10L), class = "data.frame") 

回答

2
library(dplyr)  
dff %>% 
    mutate(min123 = pmin(`123a_1`, `123a_2`, `123a_3`, `123a_4`, `123a_5`, na.rm = T)) 
+0

也非常完美,第二个到,有没有办法回到旁边的最小值? –

0

这就是功能pmin是:

> str(dff) 
'data.frame': 10 obs. of 6 variables: 
$ MCI ID: chr "070405344" "230349820" "260386435" "370390587" ... 
$ 123a_1: Date, format: "2015-08-25" "2014-10-29" "2015-10-22" ... 
$ 123a_2: Date, format: "2016-08-16" "2014-12-18" "2016-10-14" ... 
$ 123a_3: Date, format: NA NA NA ... 
$ 123a_4: Date, format: NA NA NA ... 
$ 123a_5: Date, format: NA NA NA ... 
> dff$groupmin <- pmin(dff[[2]],dff[[3]],dff[[4]], dff[[5]], dff[[6]], na.rm=TRUE) 
> head(dff) 
    MCI ID  123a_1  123a_2 123a_3 123a_4 123a_5 groupmin 
1 070405344 2015-08-25 2016-08-16 <NA> <NA> <NA> 2015-08-25 
2 230349820 2014-10-29 2014-12-18 <NA> <NA> <NA> 2014-10-29 
3 260386435 2015-10-22 2016-10-14 <NA> <NA> <NA> 2015-10-22 
4 370390587 2015-09-10 2016-08-23 <NA> <NA> <NA> 2015-09-10 
5 380406805 2015-09-22 2016-09-13 <NA> <NA> <NA> 2015-09-22 
6 391169282 2015-12-14 2016-12-05 <NA> <NA> <NA> 2015-12-14 
+0

这与'dplyr'解决方案完全相同 – Sotos

+0

@Sotos对于一个正在为这样一个简单问题而苦苦挣扎的人,我给出了一个简单的答案。通过使用非标准库和通过管道的非标准语法引入的额外复杂性似乎不利于证明另一个答案。这并不重要,因为Jaap目前有最好的答案:标准R和简洁! (有我的upvote) – Bernhard

+0

好的。如果你认为它有价值,那么通过一切手段。 – Sotos

3

使用do.callpmin一个基础R方法:

dff$min123 <- do.call(pmin, c(dff[-1], na.rm = TRUE)) 

类似appraoch在dplyr

library(dplyr)  
dff %>% 
    mutate(min123 = do.call(pmin, c(select(., -1), na.rm = TRUE))) 

或者data.table

library(data.table) 
setDT(dff)[, min123 := do.call(pmin, c(.SD, na.rm = TRUE)), .SDcols = -1] 
+0

哈......我只是想查看如何在'do.call'中传递'na.rm' :) – Sotos