【问题标题】:Merge two data frames in R according to ID-variable根据ID变量合并R中的两个数据框
【发布时间】:2015-11-10 01:39:38
【问题描述】:

我正在尝试根据 ID-variable 合并 R 中的两个数据帧,因为在第一个数据帧中,ID-variable 是一个因素,而在第二个数据帧中,ID-variable 是一个数字向量

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-variable 合并这两个数据帧时,我预计我会得到空结果,因为我们有一个字符与数字向量,但实际上 R 给了我与 ID-Variable 相同的结果第一个数据框是一个因素。

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

ID          X  Y
100 -0.2797956 4
110 -1.0397791 4

那么谁能解释一下为什么我的期望是错误的!

【问题讨论】:

    标签: r merge


    【解决方案1】:

    当你合并两列时,它们被强制转换为一个共同的class

    将因子、原始向量和列表转换为字符向量,然后将xtable强制转换为普通类型(R的排序中的两种类型中的后者,逻辑

    (来自?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"
    

    【讨论】:

    • 谢谢,我必须看看这个因素是如何变成数字的as.numeric(as.character(datC$ID))
    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2021-08-17
    • 2017-09-10
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多