比较R中的数据帧
我对R和stackoverflow真的很陌生;对我提出的问题提前道歉 我有两个数据帧 数据框1:比较R中的数据帧,r,compare,R,Compare,我对R和stackoverflow真的很陌生;对我提出的问题提前道歉 我有两个数据帧 数据框1: Product.ID Description Wholesale.Price Prod1 Desc1 1.45 Prod Desc2 1.27 Prod3 Desc 3.62 Prod4 Desc4 2.15 Prod5 Desc5 2.87 Prod12 Desc6
Product.ID Description Wholesale.Price
Prod1 Desc1 1.45
Prod Desc2 1.27
Prod3 Desc 3.62
Prod4 Desc4 2.15
Prod5 Desc5 2.87
Prod12 Desc6 2.53
Prod7 Desc7 2.20
Prod8 Desc8 2.60
Prod9 Desc9 3.68
数据框2:
Product.ID Description Wholesale.Price
Prod1 Desc1 1.45
Prod2 Desc2 1.27
Prod3 Desc3 3.62
Prod4 Desc4 1.57
Prod5 Desc5 2.87
Prod6 Desc6 2.53
Prod7 Desc7 2.20
Prod8 Desc8 3.21
Prod9 Desc9 1.81
我发现我可以使用merge(list_1,list_2)来打印两个数据帧中所有3列的匹配(这非常酷)
我正试图找到一种打印方法,在基于Product.ID的两个数据框之间的描述和批发价格之间存在差异。我甚至不知道如何以一种有意义的方式想象这些差异
非常感谢您的帮助 让我们重命名要比较的列:
names(list_1)[3] = "Price1"
names(list_2)[3] = "Price2"
现在我们可以合并并保留两个价格列
list_both = merge(list_1, list_2)
# calculate differences
list_both$difference = list_both$Price1 - list_both$Price2
# look at the top of the data
head(list_both)
# print out those with a difference
list_both[list_both$difference != 0, ]
对于可视化,我将让您自己从这里探索一下。前几天我刚刚为某人写了一篇文章来完成这项精确的任务。经过几次修改,可在此处使用:
df1 <- data.frame(Product.ID=c('Prod1','Prod','Prod3','Prod4','Prod5','Prod12','Prod7','Prod8','Prod9'), Description=c('Desc1','Desc2','Desc','Desc4','Desc5','Desc6','Desc7','Desc8','Desc9'), Wholesale.Price=c(1.45,1.27,3.62,2.15,2.87,2.53,2.20,2.60,3.68), stringsAsFactors=F );
df2 <- data.frame(Product.ID=c('Prod1','Prod2','Prod3','Prod4','Prod5','Prod6','Prod7','Prod8','Prod9'), Description=c('Desc1','Desc2','Desc3','Desc4','Desc5','Desc6','Desc7','Desc8','Desc9'), Wholesale.Price=c(1.45,1.27,3.62,1.57,2.87,2.53,2.20,3.21,1.81), stringsAsFactors=F );
df1;
## Product.ID Description Wholesale.Price
## 1 Prod1 Desc1 1.45
## 2 Prod Desc2 1.27
## 3 Prod3 Desc 3.62
## 4 Prod4 Desc4 2.15
## 5 Prod5 Desc5 2.87
## 6 Prod12 Desc6 2.53
## 7 Prod7 Desc7 2.20
## 8 Prod8 Desc8 2.60
## 9 Prod9 Desc9 3.68
df2;
## Product.ID Description Wholesale.Price
## 1 Prod1 Desc1 1.45
## 2 Prod2 Desc2 1.27
## 3 Prod3 Desc3 3.62
## 4 Prod4 Desc4 1.57
## 5 Prod5 Desc5 2.87
## 6 Prod6 Desc6 2.53
## 7 Prod7 Desc7 2.20
## 8 Prod8 Desc8 3.21
## 9 Prod9 Desc9 1.81
compare <- function(d1,d2,idcol='id',cols=setdiff(intersect(colnames(d1),colnames(d2)),idcol)) {
com <- intersect(d1[[idcol]],d2[[idcol]]);
d1com <- match(com,d1[[idcol]]);
d2com <- match(com,d2[[idcol]]);
setNames(lapply(cols,function(col) com[d1[[col]][d1com]!=d2[[col]][d2com]]),cols);
}; cmp <- compare(df1,df2,'Product.ID'); cmp;
## $Description
## [1] "Prod3"
##
## $Wholesale.Price
## [1] "Prod4" "Prod8" "Prod9"
此解决方案的一个优点是,它避免了在计算差异之前合并输入data.frames的全部内容。这样的合并是不必要的,而且会浪费CPU和内存,这对于大型输入可能非常重要。这里有一个快速的两行程序。首先从@bgoldst读取数据:
df1 <- data.frame(Product.ID=c('Prod1','Prod','Prod3','Prod4','Prod5','Prod12','Prod7','Prod8','Prod9'), Description=c('Desc1','Desc2','Desc','Desc4','Desc5','Desc6','Desc7','Desc8','Desc9'), Wholesale.Price=c(1.45,1.27,3.62,2.15,2.87,2.53,2.20,2.60,3.68), stringsAsFactors=F );
df2 <- data.frame(Product.ID=c('Prod1','Prod2','Prod3','Prod4','Prod5','Prod6','Prod7','Prod8','Prod9'), Description=c('Desc1','Desc2','Desc3','Desc4','Desc5','Desc6','Desc7','Desc8','Desc9'), Wholesale.Price=c(1.45,1.27,3.62,1.57,2.87,2.53,2.20,3.21,1.81), stringsAsFactors=F );
data.frame 1具有
Prod
和Prod12
,其中data.frame 2具有Prod2
和Prod6
,这是故意的吗?我相信这是故意的,是在最终分析中指出的额外差异
df1 <- data.frame(Product.ID=c('Prod1','Prod','Prod3','Prod4','Prod5','Prod12','Prod7','Prod8','Prod9'), Description=c('Desc1','Desc2','Desc','Desc4','Desc5','Desc6','Desc7','Desc8','Desc9'), Wholesale.Price=c(1.45,1.27,3.62,2.15,2.87,2.53,2.20,2.60,3.68), stringsAsFactors=F );
df2 <- data.frame(Product.ID=c('Prod1','Prod2','Prod3','Prod4','Prod5','Prod6','Prod7','Prod8','Prod9'), Description=c('Desc1','Desc2','Desc3','Desc4','Desc5','Desc6','Desc7','Desc8','Desc9'), Wholesale.Price=c(1.45,1.27,3.62,1.57,2.87,2.53,2.20,3.21,1.81), stringsAsFactors=F );
x <- merge(df1, df2, by = "Product.ID")
x[x$Description.x != x$Description.y | x$Wholesale.Price.x != x$Wholesale.Price.y, ]
Product.ID Description.x Wholesale.Price.x Description.y Wholesale.Price.y
2 Prod3 Desc 3.62 Desc3 3.62
3 Prod4 Desc4 2.15 Desc4 1.57
6 Prod8 Desc8 2.60 Desc8 3.21
7 Prod9 Desc9 3.68 Desc9 1.81