【问题标题】:How to quality check this data in R?如何在 R 中对这些数据进行质量检查?
【发布时间】:2021-10-29 13:45:35
【问题描述】:

我有一个 df1 有 820 行:

ID        College   Score    Score3
EI01      0         1        2
EI01      0         1        6
EI08,EI07 1         4        4
EI08,EI07 1         4        8
EI02      0         0        9
EI05      1         2        2
EI06      1         10       12

我有一个 713 行的 df2:

ID          Points
EI01        20
EI08,EI07   12
EI02        30
EI04        10

我已经尝试将这两个 df 通过“ID”与 all=FALSE 合并,但我新合并的 df 是 864 行,而我只希望它最大为 820 行,因为 df1 中的 # 。我想知道我做错了什么。此外,我想制作一个 df3,其中包含 df1 中不存在于 df2 中的所有 ID。

【问题讨论】:

  • 请提供一个可重现的例子。
  • 怎么样?它们是 800 行。我试着举出上面数据的例子
  • 与上面显示的示例相同,采用可复制的格式,可以复制到 R 中。
  • 这行得通吗? dplyr::left_join(df1,df2)?
  • 请显示您尝试过的确切代码。另外,如果你想保留df1 的所有ID,你应该使用all.x = TRUE 而不是all = FALSE

标签: r dataframe


【解决方案1】:

如果您想加入数据并进行自动 QC 检查,您可以考虑使用 tidylog 包,它将许多 dplyr 函数替换为更详细的函数。

下面是tidylog::left_join() 的示例以及您的示例数据:

> left_join(df1,df2)
Joining, by = "ID"
left_join: added one column (Points)
           > rows only in x   2
           > rows only in y  (1)
           > matched rows     5
           >                 ===
           > rows total       7
          ID College Score Score3 Points
1:      EI01       0     1      2     20
2:      EI01       0     1      6     20
3: EI08,EI07       1     4      4     12
4: EI08,EI07       1     4      8     12
5:      EI02       0     0      9     30
6:      EI05       1     2      2     NA
7:      EI06       1    10     12     NA

要查找df1 中而不是df2 中的 ID,您可以使用:

df1 %>% 
  filter(!ID %in% df2$ID) %>% 
  pull(ID)


[1] "EI05" "EI06"

【讨论】:

  • 有没有办法从 df1 中获取不在 df2 中的所有 ID 的输出
  • @Evan,是的,我更新了答案。
猜你喜欢
  • 1970-01-01
  • 2023-01-01
  • 2021-03-12
  • 1970-01-01
  • 2012-04-07
  • 2014-07-14
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多