我发现了一些类似的问题,例如这个问题(关于比较XML文件中的属性),这个问题(关于比较值是数字的情况)和这个问题(关于获取两个文件之间不同的列数),但是没有任何问题。这个特殊的问题。
我有两个CSV文本文件,其中许多(但不是全部)行是相等的。文件中的列数相同,但数据类型相同,但行数却不同。两个文件上的行数约为120K,并且两个文件中的某些行不在另一个上。
这些文件的简化版本如下所示。
文件1:
PROFILE.ID,CITY,STATE,USERID
2265,Miami,Florida,EL4950
4350,Nashville,Tennessee,GW7420
5486,Durango,Colorado,BH9012
R719,Flagstaff,Arizona,YT7460
Z551,Flagstaff,Arizona,ML1451
档案2:
PROFILE.ID,CITY,STATE,USERID
1173,Nashville,Tennessee,GW7420
2265,Miami,Florida,EL4950
R540,Flagstaff,Arizona,YT7460
T216,Durango,Colorado,BH9012
在实际文件USERID
中,第一个文件中的许多值也可以在第二个文件中找到(但是某些值可能不存在)。同样,尽管USERID
所有用户的值均未更改,但它们PROFILE.ID
可能已更改。
问题是我将不得不找到PROFILE.ID
已更改的行。
我认为我将必须使用以下步骤序列在R中对其进行分析:
USERID
第一个文件(具有更多行)上的列USERID
在第一个文件中找到的每个文件PROFILE.ID
从第二个文件返回对应的PROFILE.ID
值不同的行我正在考虑编写类似下面所示代码的内容,但不确定是否有更好的方法来实现此目的。
library(tidyverse)
con1 <- file("file1.csv", open = "r")
con2 <- file("file2.csv", open = "r")
file1 <- read.csv(con1, fill = F, colClasses = "character")
file2 <- read.csv(con2, fill = F, colClasses = "character")
for (i in seq(nrow(file1))) {
profIDFile1 <- file1$PROFILE.ID[i]
userIDFile1 <- file1$USERID[i]
profIDRowFile2 <- filter(file2, USERID == userIDFile1)
profIDFile2 <- profIDRowFile2$PROFILE.ID
if (profIDFile1 != profIDFile2) {
output < - profIDRowFile2
}
}
write.csv(output, file='result.csv', row.names=FALSE, quote=FALSE)
close(con1)
close(con2)
问: R中是否有一个可以进行这种比较的软件包,或者用R脚本完成此比较的一种好方法是什么?
我认为您可以通过简单的连接来做到这一点:
library(dplyr)
full_join(file1, file2, by = "USERID") %>%
filter(PROFILE.ID.x != PROFILE.ID.y)
# PROFILE.ID.x CITY.x STATE.x USERID PROFILE.ID.y CITY.y STATE.y
# 1 4350 Nashville Tennessee GW7420 1173 Nashville Tennessee
# 2 5486 Durango Colorado BH9012 T216 Durango Colorado
# 3 R719 Flagstaff Arizona YT7460 R540 Flagstaff Arizona
这表明这USERID
三行具有不同的PROFILE.ID
字段。(.x
来自file1
,.y
来自file2
。)
该测试不能很好地处理缺少的ID,因此您可以添加以下逻辑:
full_join(file1, file2, by = "USERID") %>%
filter(is.na(PROFILE.ID.x) | is.na(PROFILE.ID.y) |
PROFILE.ID.x != PROFILE.ID.y)
# PROFILE.ID.x CITY.x STATE.x USERID PROFILE.ID.y CITY.y STATE.y
# 1 4350 Nashville Tennessee GW7420 1173 Nashville Tennessee
# 2 5486 Durango Colorado BH9012 T216 Durango Colorado
# 3 R719 Flagstaff Arizona YT7460 R540 Flagstaff Arizona
# 4 Z551 Flagstaff Arizona ML1451 <NA> <NA> <NA>
第四行表示缺少ID file2
。这可能是一个小样本数据集(在SO:-上很不错)的人工产物,我不确定这是否对您有意义或有意义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句