如何对任意列执行行函数?

时间:2019-01-10 21:39:49

标签: r dplyr

我想使用列名而不是索引号对任意一组列执行按行操作。我知道使用基r和按数字索引的列是可行的,但是如果我可以在tidyverse管道中使用列名来进行此操作,那么对我来说,出错的可能性就较小。

这是我要做的事的基础。

set dateformat dmy;
select PersonalDetails_DOB
    ,convert(nvarchar(10), cast(PersonalDetails_DOB as datetime), 102) as ANSI_DOB
    ,convert(nvarchar(10), cast(PersonalDetails_DOB as datetime), 120) as ODBC_DOB
from Users;

reprex package(v0.2.1)于2019-01-10创建

我实际上想要一张看起来像这样的桌子

library(tidyverse)

df <- tibble(name = c("Sam", "Jane", "Erin", "Bert", "Lola"),
             age     = c(11, 10, 11, 12, 10),
             score_a = c(19, 16, 16, 5, 10),
             score_b = c(10, 10, 10, 10, 10))
df %>% 
  rowwise() %>% 
  mutate_at(vars(score_a:score_b),funs(total = sum))
#> Source: local data frame [5 x 6]
#> Groups: <by row>
#> 
#> # A tibble: 5 x 6
#>   name    age score_a score_b score_a_total score_b_total
#>   <chr> <dbl>   <dbl>   <dbl>         <dbl>         <dbl>
#> 1 Sam      11      19      10            19            10
#> 2 Jane     10      16      10            16            10
#> 3 Erin     11      16      10            16            10
#> 4 Bert     12       5      10             5            10
#> 5 Lola     10      10      10            10            10

reprex package(v0.2.1)于2019-01-10创建

1 个答案:

答案 0 :(得分:0)

我认为在行函数中使用grep()可能是一种可能性:

library(tidyverse)

df %>%
 mutate(total_score = rowSums(.[,grep("score_a|score_b", names(.))])) 

  name    age score_a score_b total_score
  <chr> <dbl>   <dbl>   <dbl>       <dbl>
1 Sam     11.     19.     10.         29.
2 Jane    10.     16.     10.         26.
3 Erin    11.     16.     10.         26.
4 Bert    12.      5.     10.         15.
5 Lola    10.     10.     10.         20.

df %>%
 mutate(total_score = rowSums(.[,grep("age|score_b", names(.))])) 

  name    age score_a score_b total_score
  <chr> <dbl>   <dbl>   <dbl>       <dbl>
1 Sam     11.     19.     10.         21.
2 Jane    10.     16.     10.         20.
3 Erin    11.     16.     10.         21.
4 Bert    12.      5.     10.         22.
5 Lola    10.     10.     10.         20.

通过这种方式,您可以选择任意一组列,并按其名称引用这些列。