在第三列 R 数据框中获取较小的值



数据帧

year1 year2
2009   2002
2003   2010
2005   2005
2006   2005
2005   NA
NA     2006

我希望通过比较两列来使第三列具有较小的值。 所以输出是这样的

year1 year2  year
2009   2002  2002
2003   2010  2003
2005   2005  2005
2006   2005  2005 
2005   NA    2005
NA     2006  2006

对于我的方法,我将 NA 更改为 1,然后比较两列,但如果我使用: 小于那时,它只会在不正确的列中给我 1

startdate$year<-ifelse(as.numeric(startdate$year1)==as.numeric(startdate$year2),
startdate$year1,startdate$year)
startdate$year<-ifelse(as.numeric(startdate$year1)<as.numeric(startdate$year2),
startdate$year2,startdate$year)
startdate$year<-ifelse(as.numeric(startdate$year1)>as.numeric(startdate$year2),
startdate$year1,startdate$year)

提前致谢:)

你可以通过pmin

df$year = pmin(df$year1, df$year2, na.rm=TRUE)
df
year1 year2 year
1  2009  2002 2002
2  2003  2010 2003
3  2005  2005 2005
4  2006  2005 2005
5  2005    NA 2005
6    NA  2006 2006

另一种选择是将applymin一起使用。

dat$year <- apply(dat, 1, min, na.rm = TRUE)
dat
#   year1 year2 year
# 1  2009  2002 2002
# 2  2003  2010 2003
# 3  2005  2005 2005
# 4  2006  2005 2005
# 5  2005    NA 2005
# 6    NA  2006 2006

数据

dat <- read.table(text = "year1 year2
2009   2002
2003   2010
2005   2005
2006   2005
2005   NA
NA     2006",
header = TRUE)

这是另一个带有pmap的版本

library(tidyverse)
dat %>%
mutate(year = pmap(., min, na.rm = TRUE))
#  year1 year2 year
#1  2009  2002 2002
#2  2003  2010 2003
#3  2005  2005 2005
#4  2006  2005 2005
#5  2005    NA 2005
#6    NA  2006 2006

或者有pmin,如果有很多列,

dat %>% 
mutate(year = pmin(!!! rlang::syms(names(.)), na.rm = TRUE))

最新更新