数据帧
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
另一种选择是将apply
与min
一起使用。
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))