R:如何在两个CSV文本文件之间查找和比较特定元素

用户名

我发现了一些类似的问题,例如这个问题(关于比较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中对其进行分析:

  1. 将两个文件作为数据帧加载到R Studio
  2. 循环浏览USERID第一个文件(具有更多行)上的列
  3. 在第二个文件中搜索USERID在第一个文件中找到的每个文件
  4. PROFILE.ID从第二个文件返回对应的
  5. 将返回值与第一个文件中的值进行比较
  6. 输出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脚本完成此比较的一种好方法是什么?

r2evans

我认为您可以通过简单的连接来做到这一点:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

UNIX,如何在两个文本文件之间比较和传输值

使用findstr比较/查找两个文本文件之间的差异

如何查找并突出显示两个文本文件之间的差异?

如何在两个文本文件中查找单词

Python。比较两个文本文件的内容

打击两个文本文件比较脚本

比较两个文本文件

C#-比较两个文本文件

Linux 比较两个文本文件

比较Perl中的两个文本文件

Python,如何在整个文本文件中多次提取两个标记之间的文本?

查找/替换文本文件中两个单词之间的字符串

在终端中查找两个文本文件之间的匹配

想要使用Java查找两个文本文件之间的内容差异

使用C获取文本文件中两个特定点之间的特定信息

删除文本文件中两个特定字符之间的内容

在文本文件中的两个特定行(关键字)之间打印多行

如何使用PowerShell比较两个文本文件以查看它们是否相等?

如何比较两个文本文件中的词频?

我如何比较两个文本文件与PHP的匹配

如何比较和合并两个文本文件?

如何比较 Django 中的两个文本文件?

如何揭示两个看似相同的文本文件之间的隐藏差异?

如何使用Java提取文本文件中两个单词之间的内容?

C#如何获得两个文本文件之间的连接

如何输出两个文本文件之间的差异?

如何在 Bash 中的两个文本文件中按行随机分区?示例 70% 和 30%

如何在Matlab中合并两个文本文件并复制生成的文件?

如何将两个文本文件与文件路径进行比较,并在另一个文本文件中输出差异?