R 跨向量的条件变元

R 跨向量的条件变元,r,if-statement,conditional-statements,R,If Statement,Conditional Statements,我希望在某个条件下相对于多个列更改一个列值。如果y2010到y2019列都有零,则该列的slope\u median有零,否则保持原样 我的预期产出: # A tibble: 6 x 13 id y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 slope_median slope_sd <dbl> <dbl> <dbl> <dbl> <dbl> <

我希望在某个条件下相对于多个列更改一个列值。如果y2010到y2019列都有零,则该列的
slope\u median
有零,否则保持原样

我的预期产出:

# A tibble: 6 x 13
     id y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 slope_median slope_sd
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>        <dbl>    <dbl>
1     1   0     0     0     0       0   0       0   0       0   0          0       0     
2     2   0.1   0     0.2   0.1     0   0.1     0   0       0   0          0.243   0.0676
3     3   0     0.3   0.3   0.2     0   0       0   0.1     0   0          0.212   0.0621
4     4   0     0     0     0       0   0       0   0       0   0.1        0.354   0.197 
5     5   0     0.4   0     0       0   0       0   0       0   0          0.516   0.156 
6     6   0     0     0     0       0   0       0   0       0   0          0       0   
这两种方法都没有达到预期效果

可复制代码:

structure(list(id = c(1, 2, 3, 4, 5, 6), y2010 = c(0, 0.1, 0, 
0, 0, 0), y2011 = c(0, 0, 0.3, 0, 0.4, 0), y2012 = c(0, 0.2, 
0.3, 0, 0, 0), y2013 = c(0, 0.1, 0.2, 0, 0, 0), y2014 = c(0, 
0, 0, 0, 0, 0), y2015 = c(0, 0.1, 0, 0, 0, 0), y2016 = c(0, 0, 
0, 0, 0, 0), y2017 = c(0, 0, 0.1, 0, 0, 0), y2018 = c(0, 0, 0, 
0, 0, 0), y2019 = c(0, 0, 0, 0.1, 0, 0), slope_median = c(0.474975518924233, 
0.243454068541322, 0.212280103001613, 0.35383141799496, 0.516334127008962, 
0.356965572683185), slope_sd = c(0.111160151030104, 0.0675751738339188, 
0.0621022972843367, 0.196846417185408, 0.155712046330888, 0.102009447727955
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))

使用
rowSums
可以计算每行中0的数量,如果它与列的数量相同,则将
slope\u median
列变为0

cols <- grep('y\\d+', names(df))
df$slope_median[rowSums(df[cols] == 0) == length(cols)] <- 0
df

# A tibble: 6 x 13
#     id y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 slope_median slope_sd
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>        <dbl>    <dbl>
#1     1   0     0     0     0       0   0       0   0       0   0          0       0.111 
#2     2   0.1   0     0.2   0.1     0   0.1     0   0       0   0          0.243   0.0676
#3     3   0     0.3   0.3   0.2     0   0       0   0.1     0   0          0.212   0.0621
#4     4   0     0     0     0       0   0       0   0       0   0.1        0.354   0.197 
#5     5   0     0.4   0     0       0   0       0   0       0   0          0.516   0.156 
#6     6   0     0     0     0       0   0       0   0       0   0          0       0.102 
cols简单:

check <- any(df[, 2:11] > 0)
df$slope_median <- ifelse(check, df$slope_median, 0)
检查0)

df$slope\u欢迎来到SO,因为您是新人,请阅读以下内容:
cols <- grep('y\\d+', names(df))
df$slope_median[rowSums(df[cols] == 0) == length(cols)] <- 0
df

# A tibble: 6 x 13
#     id y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 slope_median slope_sd
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>        <dbl>    <dbl>
#1     1   0     0     0     0       0   0       0   0       0   0          0       0.111 
#2     2   0.1   0     0.2   0.1     0   0.1     0   0       0   0          0.243   0.0676
#3     3   0     0.3   0.3   0.2     0   0       0   0.1     0   0          0.212   0.0621
#4     4   0     0     0     0       0   0       0   0       0   0.1        0.354   0.197 
#5     5   0     0.4   0     0       0   0       0   0       0   0          0.516   0.156 
#6     6   0     0     0     0       0   0       0   0       0   0          0       0.102 
check <- any(df[, 2:11] > 0)
df$slope_median <- ifelse(check, df$slope_median, 0)
library(tidyverse)
df %>% 
  rowwise() %>% 
  mutate(slope_median = ifelse(sum(c_across(starts_with("y"))) > 0, slope_median, 0))