суммировать dplyr с динамическими столбцами?

У меня есть R-код, который делает то, что я хочу. А теперь вопрос: есть ли какой-нибудь механизм, позволяющий избежать кодирования А1, А2, А3 и так далее? Я хотел бы закодировать A * для всех столбцов, начинающихся с A. Может быть любое количество столбцов «A» в зависимости от длины списка, которая определена в коде. Остальная часть кода является динамической, но здесь у меня есть ручное вмешательство (добавление некоторых столбцов A или удаление некоторых столбцов A в операторе Summerise).

Я нашел sum_at, но я не понимаю, как я могу делать другие вещи, такие как last() и sum(), одновременно для других столбцов.

  l_af <- l_cf %>%
    group_by(PID, Server) %>%
    summarise(Player=last(Player),
              Guild=last(Guild),
              Points=last(Points),
              Battles=last(Battles),
              A1=max(A1),
              A2=max(A2),
              A3=max(A3),
              A4=max(A4),
              A5=max(A5),
              A6=max(A6),
              RecCount=sum(RecCount))

Любая помощь приветствуется.


person rama1065    schedule 22.09.2019    source источник
comment
Добро пожаловать в StackOverflow! Прочтите информацию о том, как задать хороший вопрос и как поставить воспроизводимый пример. Это значительно облегчит другим людям помощь.   -  person Ronak Shah    schedule 22.09.2019


Ответы (1)


Проблема с использованием summarise заключается в удалении всех остальных столбцов, если они не используются. Вы можете рассмотреть возможность использования mutate сначала выполнить все операции, а затем использовать summarise.

library(dplyr)

l_cf %>%
  group_by(PID, Server) %>%
  mutate_at(vars(Player,Guild,Points,Battles), last) %>%
  mutate_at(vars(starts_with("A")), max) %>%
  mutate(RecCount  = sum(RecCount)) %>%
  summarise_all(max)

Воспроизводимый пример

set.seed(123)
df <- data.frame(group = rep(1:5, 2), x = runif(10), y = runif(10), 
                 a1 = runif(10), a2 = runif(10), z = runif(10))

Первое применение функций индивидуально для каждого столбца

df %>%
  group_by(group) %>%
  summarise(x=last(x),
            y=last(y),
            a1=max(a1),
            a2=max(a2),
            z=sum(z))

# A tibble: 5 x 6
#  group      x      y    a1    a2     z
#  <int>  <dbl>  <dbl> <dbl> <dbl> <dbl>
#1     1 0.0456 0.900  0.890 0.963 0.282
#2     2 0.528  0.246  0.693 0.902 0.648
#3     3 0.892  0.0421 0.641 0.691 0.880
#4     4 0.551  0.328  0.994 0.795 0.635
#5     5 0.457  0.955  0.656 0.232 1.01 

Теперь примените функции вместе для нескольких столбцов.

df %>%
  group_by(group) %>%
  mutate_at(vars(x, y), last) %>%
  mutate_at(vars(starts_with("a")), max) %>%
  mutate(z = sum(z)) %>%
  summarise_all(max)


#  group      x      y    a1    a2     z
#  <int>  <dbl>  <dbl> <dbl> <dbl> <dbl>
#1     1 0.0456 0.900  0.890 0.963 0.282
#2     2 0.528  0.246  0.693 0.902 0.648
#3     3 0.892  0.0421 0.641 0.691 0.880
#4     4 0.551  0.328  0.994 0.795 0.635
#5     5 0.457  0.955  0.656 0.232 1.01 

Мы видим, что оба подхода дали одинаковый результат.

person Ronak Shah    schedule 22.09.2019
comment
Большое спасибо! Это решает мою проблему. Кстати. в моем примере Guild содержит значения TRUE или FALSE. После мутации я получил 1 или 0. Мне пришлось их перекодировать, но это работает. - person rama1065; 23.09.2019