在R中使用Merge复制Vlookup

时间:2017-06-27 16:42:26

标签: r merge

这种帮助:How to do vlookup in R

问题:我在数据库中有一个机器编号列表,需要与它们关联的机器速率(例如$ 20.00)。在CSV(machine_rates.csv)文件中,我列出了具有相关机器速率的机器编号(分别为A和B列)。

我已尝试使用MERGE,但出于某种原因,即使我拥有all.x = TRUE,它也会在整个数据框中创建大量NA。几乎看起来如果机器#没有显示该行,它会将整行变为NA。所以这让我相信我没有正确理解MERGE函数(阅读许多帖子试图在R中找到相当于vlookup的内容)。

所以在下面,我尝试通过合并创建一个新的数据框,但在合并时,您如何告诉它创建一个新列来放置那些merged机器速率?

dBase = dbReadTable(conn, "Mfng_Data")
mBase = read.csv("Machine_Rates.csv")

dBase2 = merge(dBase, mBase, by.x = "machine_number", by.y = "machine_number",
               all.x = TRUE)

编辑:
有没有办法绕过列出所有项目? dBase包含大约一百万条记录(大约1米行x 70c矩阵)。因此,如果有150种不同的机器速率,我是否必须列出所有这些,或者是否可以通过将mBase中的机器编号与dBase中的机器编号相匹配来“索引”CSV中的这些值?

3 个答案:

答案 0 :(得分:3)

dplyr解决方案。

library(dplyr)
dbase <- data.frame(machine_number = c("10","20","30","10","10","50"),
                second_attribute=c("a","b","c","c","a","d"))
mbase <- data.frame(machine_number = c("10","20","30","40","50","60","70","80","90","100"),
                    rate=c(22,22,25,17,15,15,55,12,15,19))

left_join(dbase, mbase, by = "machine_number") 

  machine_number second_attribute rate
1             10                a   22
2             20                b   22
3             30                c   25
4             10                c   22
5             10                a   22
6             50                d   15

答案 1 :(得分:0)

如果您尝试执行内部联接的等效操作,请尝试删除all.x参数。看起来你正在寻找左连接,这是你已经尝试过的。检查你的Mfing_data。他们可能是那些神秘NA的来源。此外,如果合并列在每个数据框中具有相同的名称,则可以省略by参数。

dbase<-data.frame(machine_number=c("10","20","10","30","25"),stringsAsFactors = F)

mbase<-data.frame(machine_number=c("10","20","30","40"),machine_rate=c(32,65,12,22), stringsAsFactors = F)

merge(dbase,mbase,all.x = T)


  machine_number machine_rate
1             10           32
2             10           32
3             20           65
4             25           NA
5             30           12

答案 2 :(得分:0)

当您只有有限数量的项目时,另一种选择。

dbase <- data.frame(machine_number = c("10","20","30","10","10","50"),
                second_attribute=c("a","b","c","c","a","d"))

请注意,对于此方法,机器编号不再定义为数字。

您可以按如下方式定义小型查找向量:

lookup <- c("10"=22, "20"=22, "30"=25, "50"=15)

然后,您可以使用以下内容直接将值添加到第一个数据框中:

dbase$rate <- sapply(dbase[,1], function(x) unname(lookup[x]))
dbase
  machine_number second_attribute rate
1             10                a   22
2             20                b   22
3             30                c   25
4             10                c   22
5             10                a   22
6             50                d   15

sapply获取dbase的第一列,并将查找传递给我们定义的lookup对象。