我希望将列选择传递给ifelse语句中的dplyr函数(跨)。
这是我的数据:
tibble(var1 = c(NA,1,2),
var2 = c(NA,NA,3),
var3 = c(NA,0,0),
do_not_touch = c(1:3)
) -> test这就是我想要的:
test %>%
mutate( new_col = test %>%
select(starts_with("var")) %>%
ifelse(if_all(., is.na), NA, rowSums(across(.), na.rm=T)) )这就是我所期待的:
# A tibble: 3 x 5
var1 var2 var3 do_not_touch new_col
<dbl> <dbl> <dbl> <int> <dbl>
1 NA NA NA 1 NA
2 1 NA 0 2 1
3 2 3 0 3 5这就是我得到的:
Error in `mutate_cols()`:
! Problem with `mutate()` column `new_col`.
i `new_col = test %>% select(starts_with("var")) %>% ...`.
x unused argument (rowSums(across(.), na.rm = T))
Caused by error in `ifelse()`:
! unused argument (rowSums(across(.), na.rm = T))发布于 2022-06-30 11:41:43
一种选择是:
library(dplyr)
test %>%
mutate(new_col = ifelse(
if_all(starts_with("var"), is.na),
NA,
rowSums(across(starts_with("var")), na.rm = TRUE)))
#> # A tibble: 3 × 5
#> var1 var2 var3 do_not_touch new_col
#> <dbl> <dbl> <dbl> <int> <dbl>
#> 1 NA NA NA 1 NA
#> 2 1 NA 0 2 1
#> 3 2 3 0 3 5或者更多的是你尝试的精神:
test %>%
mutate(select(., starts_with("var")) %>%
transmute(new_col = ifelse(
if_all(.fns = is.na),
NA,
rowSums(across(), na.rm = TRUE))))
#> # A tibble: 3 × 5
#> var1 var2 var3 do_not_touch new_col
#> <dbl> <dbl> <dbl> <int> <dbl>
#> 1 NA NA NA 1 NA
#> 2 1 NA 0 2 1
#> 3 2 3 0 3 5发布于 2022-06-30 11:43:10
这行得通吗?
test %>%
rowwise() %>%
mutate(new_col=sum(across(starts_with('var')), na.rm = T)) %>%
ungroup()var1 var2 var3 do_not_touch new_col
<dbl> <dbl> <dbl> <int> <dbl>
1 NA NA NA 1 0
2 1 NA 0 2 1
3 2 3 0 3 5现在,如果您想用NA替换0,可以在那里放置一个ifelse
test %>%
rowwise() %>%
mutate(new_col=sum(across(starts_with('var')), na.rm = T)) %>%
ungroup() %>%
mutate(new_col=ifelse(new_col==0, NA, new_col))var1 var2 var3 do_not_touch new_col
<dbl> <dbl> <dbl> <int> <dbl>
1 NA NA NA 1 NA
2 1 NA 0 2 1
3 2 3 0 3 5https://stackoverflow.com/questions/72814992
复制相似问题