R根据多个条件替换多列

时间:2021-05-18 13:35:11

标签: r dplyr

我正在尝试根据多个条件替换多列:

test=data.frame(
  start=c(1,100,1000,10000),
  end=c(10,110,1010,10010),
  value=c(-1.2,-1.5,-1.02,-0.5),
  substart=c(2,102,NA,NA),
  subend=c(8,108,NA,NA)
)

If value is <= -1 and substart == NA :
I want that : substart = start and subend = end 

这是所需的输出:

  start   end value substart subend
     1    10 -1.20        2      8
   100   110 -1.50      102    108
  1000  1010 -1.02     1000   1010
 10000 10010 -0.50       NA     NA

我正在尝试使用 dplyr,但我没有得到我想要的,而且如果我可以在一个命令中全部更改它们会更好

test %>%
  mutate(substart=replace_na(substart, (value<=-1 & substart =='NA'), start))

谢谢!

2 个答案:

答案 0 :(得分:1)

试试这个:

test %>% 
   mutate(substart = ifelse(value <= -1 & is.na(substart),start,substart),
          subend = ifelse(value <= -1 & is.na(subend),end,subend))

答案 1 :(得分:1)

这是一个使用 case_when() 中的 dplyr 的版本,它可以处理多个条件,尽管这里只显示了 OP 要求的单个条件:

library(dplyr)

testdf <- data.frame(
  start=c(1,100,1000,10000),
  end=c(10,110,1010,10010),
  value=c(-1.2,-1.5,-1.02,-0.5),
  substart=c(2,102,NA,NA),
  subend=c(8,108,NA,NA)
)

testdf %>% 
  mutate(substart=case_when(value <= -1 & is.na(substart) ~ start,
                            TRUE ~ substart),
         subend=case_when(value <= -1 & is.na(subend) ~ end,
                            TRUE ~ subend))

具有所需输出:

  start   end value substart subend
1     1    10 -1.20        2      8
2   100   110 -1.50      102    108
3  1000  1010 -1.02     1000   1010
4 10000 10010 -0.50       NA     NA