匹配或返回与 R 中指定列具有相同日期的列

Posted

技术标签:

【中文标题】匹配或返回与 R 中指定列具有相同日期的列【英文标题】:Match or Return the columns that have the same date as a specified column in R 【发布时间】:2021-05-26 23:54:57 【问题描述】:

我正在处理大量患者数据。每个患者都有一行,所有不同的测试都在该行中标记为日期,列名如测试 1、测试 2 等。如果我想查看每个患者的哪些其他测试与测试 1 具有相同的日期,编写该查询的最佳方法是什么?可能有一场比赛,可能有很多场比赛,也可能没有。我希望能够看到,对于每个患者,哪些测试是在测试 1 的同一天完成的。所以这可能是一个匹配问题,但不仅仅是第一次匹配。

id<-c("ID1","ID2","ID3","ID4")
test1<-c("04-04-2004","05-05-2005","06-06-2006", "07-07-2007")
test2<-c("04-04-2005","05-05-2005","06-06-2007","07-07-2007")
test3<-c("04-04-2008","05-05-2005","06-06-2008","07-07-2007")
test4<-c("04-04-2005","05-05-2005","06-06-2009", "07-07-2008")
df<-data.frame(id,test1,test2,test3,test4)

我希望数据返回给我 test1 的匹配项,例如:for ID1: test4;对于 ID2:test2、test3、test4;对于 ID3: - ;对于 ID4:test2,test3。

【问题讨论】:

谢谢,Ronak Shah,我编辑了它。对此感到抱歉。 【参考方案1】:

这是tidyverse 方法。日期被转换为Date 格式(请注意,您在日期周围缺少引号,并且可能还缺少c() 来组合字符串)。您可以pivot_longer 将数据放入长格式,每行一个日期。然后按id分组,你可以将日期与test1的日期进行比较,filter(保留)那些。 complete 将在没有匹配项的地方填写缺失的 id

library(tidyverse)

df %>%
  mutate(across(starts_with("test"), as.Date, format = "%m-%d-%Y")) %>%
  pivot_longer(cols = -id, names_to = "test", values_to = "date") %>%
  group_by(id) %>%
  filter(date == date[test == "test1"] & test != "test1") %>%
  ungroup() %>%
  complete(id = df$id) %>%
  select(-date)

输出

  id    test 
  <chr> <chr>
1 ID1   NA   
2 ID2   test2
3 ID2   test3
4 ID2   test4
5 ID3   NA   
6 ID4   test2
7 ID4   test3

数据

df <- structure(list(id = c("ID1", "ID2", "ID3", "ID4"), test1 = c("04-04-2004", 
"05-05-2005", "06-06-2006", "07-07-2007"), test2 = c("04-04-2005", 
"05-05-2005", "06-06-2007", "07-07-2007"), test3 = c("04-04-2008", 
"05-05-2005", "06-06-2008", "07-07-2007"), test4 = c("04-04-2005", 
"05-05-2005", "06-06-2009", "07-07-2008")), class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

以上是关于匹配或返回与 R 中指定列具有相同日期的列的主要内容,如果未能解决你的问题,请参考以下文章

聚合具有相同日期的列(总和)

R - 如果列值与字符向量中的任何值匹配,则返回它旁边的列 [重复]

使用 Django ORM 使用 UNION 指定 SELECT 中的列顺序

django 在 SQL Server 中指定列排列

使用js方法将table表格中指定列指定行中相同内容的单元格进行合并操作。

添加具有基于从文件名中提取的日期的值的列(值的长度 (1) 与索引的长度 (50) 不匹配)