Среднее значение по строкам в столбцах содержит слово, кроме последнего столбца

#r #select #dplyr #string-matching

#r #выберите #dplyr #сопоставление строк

Вопрос:

Я пытаюсь получить среднее значение столбцов, которые содержат определенное слово в имени, кроме последнего столбца, содержащего то же слово в имени, пример

 df <- data.frame( ABC_1 = runif(3),
            ABC_2 = runif(3),
            ABC_3 = runif(3),
            ABC_4 = runif(3) )
 

Здесь я получаю значение для последнего столбца, содержащего слово: ABC, в col: max

 df2=df %>%  
rowwise() %>%
mutate_at(vars(last(contains('ABC'))), funs(max= max(., na.rm = TRUE))) 


      ABC_1 ABC_2 ABC_3 ABC_4   max
      <dbl> <dbl> <dbl> <dbl> <dbl>
    1 0.191 0.486 0.455 0.246 0.246
    2 0.523 0.728 0.812 0.517 0.517
    3 0.134 0.937 0.992 0.899 0.899
 

С той же логикой, теперь я попытался получить среднее значение для всех столбцов с именем ABC, кроме последнего столбца:

 df3=df %>%  
rowwise() %>%
mutate_at(vars(last(contains('ABC'))), funs(max= max(., na.rm = TRUE))) %>%
mutate_at(vars(-last(contains('ABC'))), funs(mean= mean(., na.rm = TRUE)))
 

Но, к сожалению, я не получаю ожидаемого результата:

       ABC_1 ABC_2 ABC_3 ABC_4   max ABC_1_mean ABC_2_mean ABC_3_mean max_mean
      <dbl> <dbl> <dbl> <dbl> <dbl>      <dbl>      <dbl>      <dbl>    <dbl>
    1 0.191 0.486 0.455 0.246 0.246      0.191      0.486      0.455    0.246
    2 0.523 0.728 0.812 0.517 0.517      0.523      0.728      0.812    0.517
    3 0.134 0.937 0.992 0.899 0.899      0.134      0.937      0.992    0.899
 

Комментарии:

1. Ну, я в замешательстве: вы сказали, что хотите среднее значение столбцов, содержащих ABC, но кроме последнего. Но в вашем примере вы берете максимальное значение для этого конкретного последнего столбца. Итак, эта логика не будет работать для того, что вы хотите, верно?

2. Ну, я имею в виду, что я мог бы получить значение последнего столбца с определенным именем

3. Хорошо, поэтому вам нужно изменить эту логику, чтобы получить то, что вы хотите. Все столбцы, кроме последнего. Ответ @tmfmnk кажется мне хорошим. Также: чтобы сделать ваш пример воспроизводимым, вы можете использовать set.seed(«нужное вам число») перед запуском runif . Больше информации там

4. Да, ответы @tmfmnk тоже отлично работают для меня

Ответ №1:

Одним из вариантов может быть:

 df %>%
    mutate(ABC_mean = rowMeans(across(head(starts_with("ABC"), -1))))

      ABC_1     ABC_2     ABC_3     ABC_4  ABC_mean
1 0.5957359 0.7201537 0.1304605 0.1697986 0.4821167
2 0.6865635 0.9463447 0.8447037 0.4149000 0.8258706
3 0.2364415 0.8335135 0.6342009 0.4410836 0.5680520