我有一個肝移植患者的資料框 (qtpo_liver_dates) 及其手術日期。在此資料框中,每位患者都有自己的手術日期。同一佇列的另一個資料框 (labs_v500) 顯示實驗室日期和結果,以及包括程式日期在內的訪問日期,但大多數日期是不感興趣的。我想在 R 中合并患者和手術日期的資料框(即按實際手術日期過濾 labs_v500)。我嘗試了以下但回傳了一個空白資料框
df <- merge(qtpo_liver_dates,labs_v500, by = c("patient_num","liver_date"))
有人可以解釋最好的方法嗎?


uj5u.com熱心網友回復:
您應該首先告訴 R 兩liver_date列都是日期。該功能可as.Date讓您做到這一點。
所以假設我們得到df1了df2
date1<-(c("2007-08-01", "2004-10-05", "2014-03-09"))#Year - Month - Day
date2<-(c("8/1/07", "10/5/04", "3/9/14"))#Month/Day/Year
x<-(c(1:3))
z<-c(11:13)
w<-c(11:13)
df1<-data.frame(date1, x, z)
str(df1$data1)
df1
> df1
date1 x z
1 2007-08-01 1 11
2 2004-10-05 2 12
3 2014-03-09 3 13
df2<-data.frame(date2, x, w)
str(df2$date2)
df2
> df2
date2 x w
1 8/1/07 1 11
2 10/5/04 2 12
3 3/9/14 3 13
as.Date告訴你日期所在列的格式,因為是df1YMD
df1$date1<-as.Date.character(df1$date1,format="%Y-%m-%d")
str(df1$date1)
而對于df2是 m/d/y
df2$date1<-as.Date.character(df2$date2,format="%m/%d/%y")
str(df2$date1)
我們重新編碼df2$date2indf2$date1以匹配列的名稱,稍后函式將需要它merge,在您的情況下,您可以在同一列中重新編碼,因為它們具有相同的名稱:
df3<-merge(df1,df2, by =c("date1", "x" ) )
df3
>df3
date1 x z date2 w
1 2004-10-05 2 12 10/5/04 12
2 2007-08-01 1 11 8/1/07 11
3 2014-03-09 3 13 3/9/14 13
如您所見,z并且w完美匹配,因此我們知道我們做對了。
在您的資料中:
df1=qtpo_liver_dates
df2=labs_v500
date1, date2=liver_date
x= patient_num
z= 中的某列qtpo_liver_dates
w= 中的某列labs_v500
uj5u.com熱心網友回復:
最好在此處發布問題,以便以易于使用的方式包含一些示例資料。除了圖片,您還可以dput(head(my_data_frame)獲取可以在問題中發布的資料樣本。由于您沒有這樣做,因此我創建了一小部分資料來說明解決方案。
這是我為模擬您的問題而創建的相同資料:
qtpo_liver_dates <- data.frame(
patient_num = c(1, 2, 3),
liver_date = c("2007-08-01", "2004-10-05", "2014-03-09")
)
labs_v500 <- data.frame(
patient_num = c(1, 2, 3),
liver_date = c("8/1/2007", "10/5/2004", "3/9/2014"),
other_data = c("Other Data A", "Other Data B", "Other Data C")
)
正如@jdobres 提到的那樣,由于兩個資料集中merge()的格式不同,因此不起作用。liver_date然而,這很容易通過lubridate包中的功能得到糾正。
我們將通過兩次呼叫lubridate函式來更正日期格式。首先,我們將使用mdy()which 期望月-日-年格式的資料。在第二個中,我們將使用ymd()which 以年-月-日格式查找資料。liver_date在這兩種情況下,我們都會用新的日期變數替換資料框變數中的字串。
library(lubridate)
qtpo_liver_dates$liver_date <- ymd(qtpo_liver_dates$liver_date)
labs_v500$liver_date <- mdy(labs_v500$liver_date)
現在merge()應該可以作業了,由于兩個資料幀之間的公共變數名稱相同,因此無需顯式指定它們。
merge(qtpo_liver_dates, labs_v500)
輸出:
patient_num liver_date other_data
1 1 2007-08-01 Other Data A
2 2 2004-10-05 Other Data B
3 3 2014-03-09 Other Data C
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441283.html
