我試圖將兩個數據集連接在一起。稱他們爲x和y。我相信y中的ID變量是x中ID變量的一個子集。但不是純粹的意義,因爲我知道x比y包含更多的ID,但我不知道映射。也就是說,x和y中的一些(但不是全部)ID可以匹配1:1。R中的一個複雜合併標記了無與倫比的觀察值?
我的最終目標是找出1:1映射失敗的位置並標記這些觀察值。我認爲合併將是一條路,但也許不是。示例如下:
id <- c(1:10, 1:100)
X1 <- rnorm(110, mean = 0, sd = 1)
year <- c("2004","2005","2006","2001","2002")
year <- rep(year, 22)
month = c("Jul","Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr")
month <- rep(month, 11)
#dataset X
x <- cbind(id, X1, month, year)
#dataset Y
id2 <- c(1:10, 200)
Y1 <- rnorm(11, mean = 0 , sd = 1)
y <- cbind(id2,Y1)
#merge on the IDs; but we get an error because when id2 == 200 in y we don't
#have a match in x
result <- merge(x, y, by.x="id", by.y = "id2", all =TRUE)
由於id2 == 200在x數據集中沒有匹配,所以合併拋出錯誤。不幸的是,我丟失了ID和所有信息! (它應該在111行等於200):
tail(result)
id X1 month year Y1
106 95 -0.0748386054887876 Nov 2002 NA
107 96 0.196765325477989 Dec 2004 NA
108 97 0.527922135906927 Jan 2005 NA
109 98 0.197927230533413 Feb 2006 NA
110 99 -0.00720474886698309 Mar 2001 NA
111 <NA> <NA> <NA> <NA> -0.9664941
更重要的是,我得到的合併文件的ID變量重複觀測。 id2 == 1觀察值只存在一次,但它只複製了兩次(例如,Y1的值爲1.55兩次)。
head(result)
id X1 month year Y1
1 1 -0.67371266313441 Jul 2004 1.553220
2 1 -0.318666983469993 Jul 2004 1.553220
3 10 -0.608192898092431 Apr 2002 1.234325
4 10 -0.72299929212347 Apr 2002 1.234325
5 100 -0.842111221826554 Apr 2002 NA
6 11 -0.16316681842082 Jul 2004 NA
這次合併讓事情比我想要的更復雜。我希望能夠檢查x中的每個觀察結果,並找出id與id2匹配的位置,並標記沒有的id。所以我會得到一個新的向量,稱之爲標誌,如果x $ id在y $ id2中有一個匹配,則它的值爲1,否則爲零。這樣,我可以知道1:1映射失敗的位置。我可以通過重新編寫這些NAs來獲得一些牽引力,但是當id2 == 200時會引發錯誤呢?它只是丟棄信息。
我試圖追加的行,沒有運氣,它看起來像我應該放棄合併爲好,也許這是更好地擰循環或函數來執行這些方針的東西:在X每個觀測
ID2 =其中(ID2)對應於ID - 月 - 年
標誌= 1,如果上述長度爲== 1,否則爲0
等
希望這一切都有道理。我會非常感謝任何幫助或指導。
'cbind'創建矩陣,而不是數據框。您創建'x'和'y'的調用應該是'x < - data.frame(id,X1,month,year)'和'y < - data.frame(id2,Y1)'。 –
由於'x'中有兩行'x $ id == 1',因此您得到了兩個'y $ id2 == 1'的觀察值。如果合併看到與連接標準相匹配的多個觀察值,它將爲每個可能的組合創建一行。這是設計並且非常有用。 –