【问题标题】:R - Merging together two spreadsheets with special conditionsR - 将两个具有特殊条件的电子表格合并在一起
【发布时间】:2020-05-23 04:37:39
【问题描述】:

我正在尝试将 R 中的两个电子表格(CSV 文件)合并在一起,条件有些复杂。每个数据文件都包含一个海洋物种列表和分类生态分配(以分配数字的形式,1-6)。查看所有列标题的图片。

这两个文件是:

my_data.csv

matt_data.csv

我想通过属名(两个电子表格中的列标题)来匹配它们。如果属名匹配,我想将数据合并在一起。

特殊条件:

1) 如果属名不匹配,并且它在 matt_data 但不在 my_data 中,我希望丢弃与该属相关联的行。 my_data 仅包含当前存在的物种,而 matt_data 包含一些已灭绝的物种,我只想要当前存在的物种。如果属名不匹配并且它在 my_data 但不在 matt_data 中,我希望不要删除该行。

2) matt_data 中的给定属可能匹配 my_data 中的多行,因为 matt_data 仅被分类到属级别,而 my_data 被分类到物种名称。我希望 matt_data 与它们共有的所有属相匹配。例如,假设 homo 是 matt_data 中的一个属(只有 1 行),而我在 my_data 中有 10 个均属,我希望 matt_data 行中的信息能与 my_data 中的所有 10 个均属相匹配。

如果其中任何一个没有意义,请告诉我,我可以澄清更多。

我之前使用了一个代码来合并一组不同的电子表格(复制如下),但在这种情况下它不起作用。另外我不相信这段代码不能正确处理我的特殊情况?

setwd("C:/Users/TrevorB/Documents/My Documents/Academics/TCBES/Thesis/IUCN WoRMS")


my_list = read.csv("C:/Users/TrevorB/Documents/My Documents/Spreadsheet Ecological Assignment.csv", header=T)
matt_list = read.csv("C:/Users/TrevorB/Documents/My Documents/matt_data.csv", header=T)

my_list$matt_list <- matt_list$category[match(my_list$genus, matt_list$genus)]

write.csv(my_list, file = 'combined.csv')

【问题讨论】:

  • 您的描述是左连接。你可以通过几种不同的方式做到这一点,但最简单的可能是使用 dplyr 包:left_join(my_list, matt_list, by = "genus")
  • 请不要发布代码/数据/错误的图像:它不能被复制或搜索 (SEO),它会破坏屏幕阅读器,并且它可能不适合某些移动设备。参考:meta.stackoverflow.com/a/285557/3358272(和xkcd.com/2116)。请直接包含代码或数据(例如,dput(head(x))data.frame(...))。
  • 使用base R 你可以使用merge(my_list, matt_list, by = 'genus', all.x = T)

标签: r csv merge conditional-statements spreadsheet


【解决方案1】:

有几种方法可以做到这一点:

基础 R:

merge(my_list, matt_list, by = 'genus', all.x = T)

plyr:

join(my_list, matt_list, by = 'genus', type = 'left')

dplyr:

left_join(my_list, matt_list, by = 'genus')

我个人在可能的情况下更喜欢base R,但plyr 不会重新排列你的行,这很好。

编辑:

您可以删除by 参数以根据所有匹配的列名进行匹配,或者使用by = c('genus', 'other_col') 等添加其他列进行连接

【讨论】:

  • 感谢您的帮助!我尝试运行所有三种方法,但我遇到的一个问题是所有三种方法都创建了第二组用于运动、分层、喂养和参考的列(这样我每个类别都有 2 个 - 每个数据集中一个)。有没有办法合并,使这些共同的类别也被合并(同时仍然通过匹配的属合并)?
  • 您可以将by 更改为向量以包含任意数量的列名。或者,如果您将其留空,它将通过连接两个数据框之间的所有匹配列名来加入
  • 另外,如果此回复确实回答了您的问题,请务必勾选“已回答”按钮以帮助未来的读者
  • 感谢您对 RAB 的所有帮助!当我加入我想要的所有列时(使用向量并通过留空让 R 匹配)没有 matt_data 出现在组合列中。例如,在我的数据表中,我填写了 482 个分层行,在 matt_data 表中填写了与属匹配的 1160 个分层行(1160 基于 matt_data 分层列中的值的计数,当数据表与仅使用“by=genus”复制列)。按所有匹配列组合时的组合数据集仍然只有 482 个用于分层的值。
  • 我可能只是手动将数字从 'by=genus' 函数生成的重复列中移出,因为在一些条目中,我分配了与 matt_data 中的不同的分层/运动/喂养值。这是一个重要的质量控制步骤,以查看在分类上存在分歧的地方(除非有一种方法可以突出显示我和马特都填写了一个属,并且我们对分层/运动/喂养有不同的值)
猜你喜欢
  • 2015-11-12
  • 2013-07-03
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2017-06-11
相关资源
最近更新 更多