簡體   English   中英

根據 ID 變量合並 R 中的兩個數據幀

[英]Merge two data frames in R according to ID-variable

我試圖根據 ID-variable 在 R 中合並兩個數據幀,因為在第一個數據幀中 ID 變量是一個因子,而在第二個數據幀中 ID 變量是一個數字向量

datC <- data.frame("ID" = c("001","010","100","110"), "X" = rnorm(4))
datD <- data.frame("ID" = c(001,010,100,110,210), "Y" = rpois(5,3))
merge(datC,datD,by="ID")

ID           X  Y
100  0.03284493 2
110 -0.41690986 3

正如我們看到的 001,010 丟失了,我很清楚它們為什么丟失以及我如何解決這個問題

datC$ID <- as.numeric(as.character(datC$ID))
merge(datC,datD,by="ID")

我試圖通過讓 R 避免將字符向量視為一個因素來找到另一種解決方案

datC <- data.frame("ID" = c("001","010","100","110"), "X" = rnorm(4),stringsAsFactors = F)
datD <- data.frame("ID" = c(001,010,100,110,210), "Y" = rpois(5,3))

當我根據 ID 變量合並這兩個數據幀時,我預計我會得到空結果,因為我們有一個字符與數字向量,但實際上 R 給了我與第一個數據幀中的 ID 變量相同的結果是一個因素。

merge(datC,datD,by="ID")

ID          X  Y
100 -0.2797956 4
110 -1.0397791 4

那么有人可以解釋我為什么我的期望是錯誤的!

當您合並兩列時,它們會被強制轉換為一個公共class

因子、原始向量和列表被轉換為字符向量,然后在匹配之前將xtable強制轉換為一個公共類型(R 排序中的兩種類型中的后者,logical < integer < numeric < complex < character)。

(來自?match幫助頁面,從?merge鏈接)

所以你的numeric列變成了character ,你的factor

as.character(c(001,010,100,110,210))
# [1] "1"   "10"  "100" "110" "210"

這解釋了在 OP 中看到的結果。 這種強制在整個 R 中很常見。


評論。 對於 ID 列,我總是使用character ; 它比替代方案少很多麻煩。 sprintf可以方便地添加前導零,確保所有 ID 的字符長度相同:

sprintf("%03d", c(001,010,100,110,210))
# [1] "001" "010" "100" "110" "210"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM