dplyr - ввод столбцов в rowwise () с индексом столбца вместо имени столбца - PullRequest
2 голосов
/ 29 января 2020

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

{ ссылка }

Данные по общему признанию не аккуратны, но решение, которое я скопировал ниже, выполняет свою работу:

data %>% 
    rowwise() %>% 
    mutate(c=mean(c(a,b)))

#      id     a     b     c
#   (dbl) (dbl) (dbl) (dbl)
# 1   101     1     2   1.5
# 2   102     2     2   2.0
# 3   103     3     2   2.5

Однако, в отличие от этого более простого примера, я слишком много столбцов, чтобы назвать. Мне интересно, есть ли какой-нибудь способ быстрой ссылки на столбцы, используя разделительную нотацию (то есть вместо c (a, b), что-то вроде 2: 3) или какой-либо другой способ ссылки на столбцы через их индекс.

Я нашел нечто похожее в другом потоке переполнения стека здесь , но у решения есть свои проблемы, поскольку мы перечисляем все индексы столбцов вместо имен столбцов. У меня слишком много столбцов, чтобы перечислить их все для каждого расчета.

Есть какие-нибудь решения?

РЕДАКТИРОВАТЬ: Я сам понял это, но мне кажется, что это слишком не элегантно, и я полагаю, что, возможно, извлекаю весь столбец для каждой строки что, очевидно, будет более медленным решением, чем ожидалось:

data %>%
  mutate(id = row_number()) %>%
  rowwise() %>%
  mutate(avg = mean(c(.[id, 2:4], recursive=TRUE)))

Какие решения быстрее?

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Вы можете сделать:

df %>%
 mutate(c = rowMeans(select(., 2:3)))

   id a b   c
1 101 1 2 1.5
2 102 2 2 2.0
3 103 3 2 2.5

Или:

df %>%
 mutate(c = rowMeans(select(., 2:length(.))))
1 голос
/ 29 января 2020

Для меня использование rowMeans кажется простым без участия tidyverse функций.

data$c <- rowMeans(data[2:3])

однако, если вы предпочитаете решение tidyverse, мы можем немного помочь с функциями purrr map.

library(dplyr)
library(purrr)

Только для двух столбцов

data %>% mutate(c = map2_dbl(a, b, ~mean(c(.x, .y))))

Для многих столбцов

data %>%  mutate(c = pmap_dbl(select(., a:b), ~mean(c(...))))
...