按ID列分组,然后折叠布尔列进行汇总

时间:2018-06-29 13:26:18

标签: r dataframe dplyr

尝试将具有重复ID的行的具有多个布尔列的数据框转换为新的数据框,其中每个ID仅具有一个条目,但ID组的布尔值将组合在一起。我还想记下最新的日期值。

示例输入:

     ID S1 S2 S3 S4  Date
1   ex1  1  0  0  0  4/7/12
2   ex1  0  1  0  0  6/8/16
3   ex2  0  0  1  0  5/5/15
4   ex3  1  1  0  0  4/19/13
5   ex3  0  1  0  1  6/7/15
6   ex4  0  1  0  0  8/7/09
7   ex5  1  1  1  0  6/12/17

所需的输出:

    ID S1 S2 S3 S4  Date
   ex1  1  1  0  0  6/8/16
   ex2  0  0  1  0  5/5/15
   ex3  1  1  0  1  6/7/15
   ex4  0  1  0  0  8/7/09
   ex5  1  1  1  0  6/12/17

2 个答案:

答案 0 :(得分:1)

简单总结如下-

df <- df %>% group_by(ID) %>% summarize( S1=max(S1), S2 =max(S2), S3 =max(S3), S4 = max(S4), Date = max(Date) )

答案 1 :(得分:0)

library(data.table)
setDT(df)

df[, lapply(.SD, max), ID]

#     ID S1 S2 S3 S4       Date
# 1: ex1  1  1  0  0 2016-06-08
# 2: ex2  0  0  1  0 2015-05-05
# 3: ex3  1  1  0  1 2015-06-07
# 4: ex4  0  1  0  0 2009-08-07
# 5: ex5  1  1  1  0 2017-06-12

这也有效:

library(dplyr)
df %>% 
  group_by(ID) %>% 
  summarise_all(max)

或在Base R中:

do.call(rbind
        , lapply(split(df, df$ID)
                 , function(g) data.frame(lapply(g, max))))

使用的数据:

df <- fread("
a     ID S1 S2 S3 S4  Date
1   ex1  1  0  0  0  4/7/12
2   ex1  0  1  0  0  6/8/16
3   ex2  0  0  1  0  5/5/15
4   ex3  1  1  0  0  4/19/13
5   ex3  0  1  0  1  6/7/15
6   ex4  0  1  0  0  8/7/09
7   ex5  1  1  1  0  6/12/17
")[, -1]
df[, Date := lubridate::mdy(Date)]