按ID和日期合并行

时间:2018-02-11 18:52:42

标签: r date merge

我是R的新手,我一直在寻找如何解决以下问题。

我的df看起来像:

id ------------日期------------ OB1 ------ OB2 ----- OB3
1 ------- 2017-01-01 --------- 1 --------- 0 --------- 0
2 ------- 2006-01-05 --------- 1 --------- 0 --------- 0
2 ------- 2007-04-19 --------- 0 --------- 1 --------- 0
3 ------- 2015-02-23 --------- 0 --------- 0 --------- 1
3 ------- 2015-02-23 --------- 1 --------- 0 --------- 0

我需要达到的目的是:

id ------------日期------------ OB1 ------ OB2 ----- OB3
1 ------- 2017-01-01 --------- 1 --------- 0 --------- 0
2 ------- 2006-01-05 --------- 1 --------- 0 --------- 0
2 ------- 2007-04-19 --------- 0 --------- 1 --------- 0
3 ------- 2015-02-23 --------- 1 --------- 0 --- ------ 1

这是按行和日期组合行。

如果有价值' 1'对于OB3的日期和价值' 1'对于同一日期的OB1(对于相同的ID),结果必须是值' 1'对于OB1,值' 1'对于' OB3'和一个日期

我一直试图应用这里解释的一些解决方案: Merge rows having same values in multiple columns

但它没有工作

编辑:OB1,OB2,OBS3是布尔值 谢谢你的帮助!

编辑2:聚合(.~ID + Date,df,any)有效!

样本数据

输入数据

structure(list(ID = c(-1L, 1L, 1L), Date = c("2008-01-15", "2011-01-21", "2011-01-21"), `OBS1` = c(0, 0, 0), `OBS2` = c(0, 0, 0), `OBS3` = c(0, 0, 0), `OBS4` = c(0, 0, 0), `OBS5` = c(0, 0, 0), `OBS6` = c(0, 1, 0)), .Names = c("ID", "Date", "OBS1", "OBS2", "OBS3", "OBS4", "OBS5", "OBS6"), row.names = c(NA, 3L), class = "data.frame")

输出数据

structure(list(ID = c(-1L, 1L), Date = c("2008-01-15", "2011-01-21"), `OBS1` = c(FALSE, FALSE), `OBS2` = c(FALSE, FALSE), `OBS3` = c(FALSE, FALSE), `OBS4` = c(FALSE, FALSE), `OBS5` = c(FALSE, FALSE), `OBS6` = c(FALSE, TRUE)), .Names = c("ID", "Date", "OBS1", "OBS2", "OBS3", "OBS4", "OBS5", "OBS6"), row.names = c(NA, -2L), class = "data.frame")

1 个答案:

答案 0 :(得分:3)

使用基础R aggregate()函数已经回答了这个问题。

然而,我感到有挑战的是将问题中打印的样本数据集转换为可重现的示例(之前 OP编辑问题以包括dput()的结果)。

此外,OP已经提到他有一个"非常大的df" ,这可能值得尝试data.table方法。

将样本数据转换为数据帧

library(magrittr)
library(data.table)
df <- readr::read_file(
"id------------Date ------------OB1------ OB2----- OB3
1 ------- 2017-01-01 --------- 1 --------- 0--------- 0
2 ------- 2006-01-05 --------- 1 --------- 0--------- 0
2 ------- 2007-04-19 --------- 0 --------- 1--------- 0
3 ------- 2015-02-23 --------- 0 --------- 0--------- 1
3 ------- 2015-02-23 --------- 1 --------- 0--------- 0"
) %>% stringr::str_replace_all("[-]{2,}", " ") %>% 
  fread()
df
   id       Date   OB1   OB2   OB3
1:  1 2017-01-01  TRUE FALSE FALSE
2:  2 2006-01-05  TRUE FALSE FALSE
3:  2 2007-04-19 FALSE  TRUE FALSE
4:  3 2015-02-23 FALSE FALSE  TRUE
5:  3 2015-02-23  TRUE FALSE FALSE

请注意fread()已自动识别布尔列。

汇总

library(data.table)
setDT(df)[, lapply(.SD, any), by = .(id, Date)]
   id       Date   OB1   OB2   OB3
1:  1 2017-01-01  TRUE FALSE FALSE
2:  2 2006-01-05  TRUE FALSE FALSE
3:  2 2007-04-19 FALSE  TRUE FALSE
4:  3 2015-02-23  TRUE FALSE  TRUE

如果OP需要整数值01而不是逻辑值,可以一次创建:

setDT(df)[, lapply(.SD, function(x) as.integer(any(x))), by = .(id, Date)]
   id       Date OB1 OB2 OB3
1:  1 2017-01-01   1   0   0
2:  2 2006-01-05   1   0   0
3:  2 2007-04-19   0   1   0
4:  3 2015-02-23   1   0   1
相关问题