Как свернуть строки с одинаковым идентификатором и сохранить непустые значения столбца? - PullRequest
2 голосов
/ 07 мая 2019

У меня есть таблица, в которой (после некоторой начальной обработки) есть несколько строк с одинаковым основным идентификатором, но с разными значениями столбцов (либо 0, либо значение> 0).

Пример таблицы с основным идентификатором "продукты"

df = data.frame(produce = c("apples","apples", "bananas","bananas"),
                grocery1=c(0,1,1,1),
                grocery2=c(1,0,1,1),
                grocery3=c(0,0,1,1))


###########################

> df
  produce grocery1 grocery2 grocery3
1  apples        0        1        0
2  apples        1        0        0
3 bananas        1        1        1
4 bananas        1        1        1

Я хотел бы свернуть (или объединить?) Строки с одним и тем же идентификатором и сохранить непустые (здесь любые ненулевые значения) значения в каждом столбце

Пример желаемого выхода

 shopping grocery1 grocery2 grocery3
1   apples        1        1        0
2  bananas        1        1        1

Есть ли в tidyverse простая функция или трубопровод, которые мне не хватает и которые могут с этим справиться?

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Используя базу R aggregate мы можем сделать

aggregate(.~produce, df, function(x) +any(x > 0))

#  produce grocery1 grocery2 grocery3
#1  apples        1        1        0
#2 bananas        1        1        1

Или используя dplyr

library(dplyr)
df %>%
  group_by(produce) %>%
  summarise_all(~+any(. > 0))

#  produce grocery1 grocery2 grocery3
#  <fct>      <int>    <int>    <int>
#1 apples         1        1        0
#2 bananas        1        1        1

и то же самое с data.table

library(data.table)
setDT(df)[, lapply(.SD, function(x) +any(x > 0)), by=produce]
1 голос
/ 07 мая 2019

Мы можем использовать max

library(dplyr)
df %>%
   group_by(produce) %>% 
   summarise_all(max)
# A tibble: 2 x 4
#  produce grocery1 grocery2 grocery3
#  <fct>      <dbl>    <dbl>    <dbl>
#1 apples         1        1        0
#2 bananas        1        1        1
...