R 跨向量的条件变元
我希望在某个条件下相对于多个列更改一个列值。如果y2010到y2019列都有零,则该列的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> <
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))