如何折叠具有相同标识符的行并保留非空列值?

时间:2019-05-07 01:11:30

标签: r dplyr tidyr

我有一个表,该表(经过一些初始处理)具有多个具有相同主标识符但具有不同列值(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 个答案:

答案 0 :(得分:2)

使用底数为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 :(得分:1)

我们可以使用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