Dplyr суммировать несколько столбцов в зависимости от условия - PullRequest
0 голосов
/ 01 октября 2018

У меня есть такой тип данных:

df.in <-structure(list(id = c(1, 1, 2, 3), x1 = c(0, 1, NA, 0), x2 = c("Lorem ipsum dolor sit amet", 
                                                                    "dolore eu fugiat nulla pariatur", "Sed ut perspiciatis unde omnis", 
                                                                    "Nemo enim ipsam voluptatem"), x3 = c("Donec ullamcorper elit quis risus", 
                                                                                                          "Donec ullamcorper elit quis risus", "Curabitur euismod", "Mauris felis orci"
                                                                    )), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"
                                                                    ))

> df.in
# A tibble: 4 x 4
     id    x1 x2                              x3                               
  <dbl> <dbl> <chr>                           <chr>                            
1     1     0 Lorem ipsum dolor sit amet      Donec ullamcorper elit quis risus
2     1     1 dolore eu fugiat nulla pariatur Donec ullamcorper elit quis risus
3     2    NA Sed ut perspiciatis unde omnis  Curabitur euismod                
4     3     0 Nemo enim ipsam voluptatem      Mauris felis orci 


Я пытаюсь dplyr::group_by() получить это:

df.out <- structure(list(id = c(1, 2, 3), x1 = c(1, NA, 0), x2 = c("dolore eu fugiat nulla pariatur", 
                                                                   "Sed ut perspiciatis unde omnis", "Nemo enim ipsam voluptatem"
), x3 = c("Donec ullamcorper elit quis risus", "Curabitur euismod", 
          "Mauris felis orci")), row.names = c(NA, -3L), class = c("tbl_df", 
                                                                   "tbl", "data.frame"))

> df.out
# A tibble: 3 x 4
     id    x1 x2                              x3                               
  <dbl> <dbl> <chr>                           <chr>                            
1     1     1 dolore eu fugiat nulla pariatur Donec ullamcorper elit quis risus
2     2    NA Sed ut perspiciatis unde omnis  Curabitur euismod                
3     3     0 Nemo enim ipsam voluptatem      Mauris felis orci  


Я могу сделать:

df.in %>%
  group_by(id) %>%
  summarise(x1 = max(x1))


Однако, как мне:

  1. Суммировать x2,x3 чтобы сохранить значение, где max(x1) встречается?
  2. У меня есть несколько x, которым нужна одна и та же логика.Есть ли способ сделать summarize_all?

1 Ответ

0 голосов
/ 01 октября 2018

Мы можем создать условие с max в summarise_at

library(dplyr)
df.in %>% 
  group_by(id) %>% 
  summarise_at(3:4, funs(if(n() == 1) . else .[x1 == max(x1, na.rm = TRUE)]))

Вместо использования summarise_at, мы можем также сделать filter или slice

df.in %>%
  group_by(id) %>% 
  filter((n() == 1) | (x1 == max(x1, na.rm = TRUE)))

Или используйте slice

df.in %>% 
  group_by(id) %>% 
  slice(which(n() == 1 | (x1 == max(x1, na.rm = TRUE)))[1])
...