问题:我在数据库中有一个机器编号列表,需要与它们关联的机器速率(例如$ 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中的这些值?
答案 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
对象。