根据ID变量

时间:2015-11-10 01:39:38

标签: r merge

我试图根据ID变量合并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避免TO将字符向量视为因子来找到另一种解决方案

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

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

ID          X  Y
100 -0.2797956 4
110 -1.0397791 4

所以有人可以解释为什么我的期望是假的!

1 个答案:

答案 0 :(得分:1)

合并两列时,它们会被强制转换为公共class

  

因子,原始向量和列表被转换为字符向量,然后xtable被强制转换为公共类型(R的排序中的两个类型中的较晚,逻辑&lt;整数&lt ;匹配前的数字&lt; complex&lt;字符)

     

(来自?match帮助页面,链接自?merge

所以numeric列变为characterfactor也是如此:

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"