【问题标题】:How to match two columns in one dataframe using values in another dataframe in R如何使用 R 中另一个数据框中的值匹配一个数据框中的两列
【发布时间】:2022-01-17 03:46:21
【问题描述】:

我有两个数据框。一个是一组 ≈4000 个条目,看起来与此类似:

| grade_col1 | grade_col2 |
| --- | --- |
| A-| A-|
| B | 86|
| C+| C+|
| B-| D |
| A | A |
| C-| 72|
| F | 96|
| B+| B+|
| B | B |
| A-| A-|

另一个是一组 ≈700 个条目,看起来与此类似:

| grade | scale |
| --- | --- |
| A+|100|
| A+| 99|
| A+| 98|
| A+| 97|
| A | 96|
| A | 95|
| A | 94|
| A | 93|
| A-| 92|
| A-| 91|
| A-| 90|
| B+| 89|
| B+| 88|

...等等。

我要做的是创建一个新列,显示grade_col2 是否与grade_col1 与二进制0-1 输出匹配(0 = 不匹配,1 = 匹配)。 Grade_col2 的大部分以字母等级显示。但是每隔一段时间,grade_col2 中的一个条目就会被意外地输入为数字等级。即使grade_col2 是数字等级而不是字母等级,我也希望此匹配列给我一个“1”。换句话说,如果grade_col1 是B 而grade_col2 是86,我希望这仍然被读作匹配。只有当grade_col1 为F 且grade_col2 为96 时,这 才匹配(类似于grade_col1 为B- 且grade_col2 为D = 不匹配)。

第二个数据框给了我需要在一个和另一个之间转换的信息(97-100 之间的条目是 A+,93-96 之间是 A,等等)。我只是不知道如何运行一个脚本,该脚本使用此信息在所有 ≈4000 个条目中查找匹配项。理论上,我可以手动执行此操作,但实际数据集太长以至于不现实。

我一直在考虑在 dplyr 中使用嵌套的 if_else 语句。但是一旦我通过了第一个“if”语句,我就卡住了。对此人能提供的任何帮助,我将不胜感激。

【问题讨论】:

  • 看看dplyr::case_when

标签: r dplyr


【解决方案1】:

您可以使用连接来做到这一点。

让您的第一个数据框为grades_df,您的第二个数据框为lookup_df,然后您需要以下内容:

output = grades_df %>%
  # join on look up, keeping everything grades table
  left_join(lookup_df, by = c(grade_col2 = "scale")) %>%
  # combine grade_col2 from grades_df and grade from lookup_df
  mutate(grade_col2b = ifelse(is.na(grade), grade_col2, grade)) %>%
  # indicator column
  mutate(indicator = ifelse(grade_col1 == grade_col2b, 1, 0))

【讨论】:

  • 这是完美的。输入代码,没有问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多