首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过tidyselect::starts_with(.)dplyr函数等?

如何通过tidyselect::starts_with(.)dplyr函数等?
EN

Stack Overflow用户
提问于 2022-06-30 11:29:00
回答 2查看 99关注 0票数 0

我希望将列选择传递给ifelse语句中的dplyr函数(跨)。

这是我的数据:

代码语言:javascript
复制
tibble(var1 = c(NA,1,2),
       var2 = c(NA,NA,3),
       var3 = c(NA,0,0),
       do_not_touch = c(1:3)
       ) -> test

这就是我想要的:

代码语言:javascript
复制
test %>% 
  mutate( new_col = test %>% 
            select(starts_with("var")) %>% 
            ifelse(if_all(., is.na), NA, rowSums(across(.), na.rm=T)) )

这就是我所期待的:

代码语言:javascript
复制
# 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

这就是我得到的:

代码语言:javascript
复制
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))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-30 11:41:43

一种选择是:

代码语言:javascript
复制
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

或者更多的是你尝试的精神:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2022-06-30 11:43:10

这行得通吗?

代码语言:javascript
复制
test %>%
  rowwise() %>%
  mutate(new_col=sum(across(starts_with('var')), na.rm = T)) %>%
  ungroup()
代码语言:javascript
复制
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

代码语言:javascript
复制
test %>%
  rowwise() %>%
  mutate(new_col=sum(across(starts_with('var')), na.rm = T)) %>%
  ungroup() %>%
  mutate(new_col=ifelse(new_col==0, NA, new_col))
代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72814992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档