匹配或返回与 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 中的列顺序