迭代两个数据框以在 R 中创建标准列

Iterate over two dataframes to create a criterion column in R

我希望通过迭代两个数据框来形成最终数据框。

第一个 df 看起来像这样


employee_name <- c("rob", "peter")
employee_attribute1 <- c("10", "5")
employee_attribute2 <- c("5", "5")
employee_df <- data.frame(employee_name, employee_attribute1,employee_attribute2)

第二个看起来像这样。员工可以而且确实属于多个组

employee_group <- c("1", "2","3" )
employee_attributes <- c("employee_attribute2", "employee_attribute2","employee_attribute1" )
group_att_mapping_df <- data.frame(employee_group,employee_attributes)

我想创建一个这样的数据框。评级条件是,如果 employee_df 中的员工属性得分对于 employee_attributes(来自 group_att_mapping_df)= 10,则评级为 1,否则为 2。

 employee_group| employee_name | employee_rating
     1         | Rob            |  2 
     1         | Peter          |  2
     2         | Rob            |  2
     2         |Peter           |  2
     3         | Rob            |  1
     3         | Peter         |  2

需要帮助编写有效的 R 代码来迭代两个数据帧。 我将附上到目前为止我编写的循环的屏幕截图。非常感谢。

您不需要遍历数据帧。您可以使用旋转和连接来获得预期的输出:

employee_df %>% 
  tidyr::pivot_longer(
    contains("attribute"), 
    names_to = "employee_attributes", 
    values_to = "attribute_score"
  ) %>% 
  left_join(group_att_mapping_df) %>% 
  mutate(employee_rating = ifelse(attribute_score == 10, 1, 2)) %>% 
  select(employee_group, employee_name, employee_rating) %>% 
  arrange(employee_group)

#> Joining, by = "employee_attributes"
#> # A tibble: 6 x 3
#>   employee_group employee_name employee_rating
#>   <chr>          <chr>                   <dbl>
#> 1 1              rob                         2
#> 2 1              peter                       2
#> 3 2              rob                         2
#> 4 2              peter                       2
#> 5 3              rob                         1
#> 6 3              peter                       2

解释:

  • 首先我们旋转 employee_df 以将所有属性变量作为一列。
  • 接下来我们使用 group_att_mapping_df 左连接以获得 employee_group 列。
  • 然后我们根据您的逻辑创建 employee_rating 列:如果属性得分为 10,则为 1,否则为 2。
  • 最后,我只是让数据看起来与您的预期输出相同,方法是选择您想要的列并按 employee_group 对它们进行排序。

没有 ...

的数据
employee_name <- c("rob", "peter")
employee_attribute1 <- c("10", "5")
employee_attribute2 <- c("5", "5")
employee_df <- data.frame(employee_name, employee_attribute1,employee_attribute2)

employee_group <- c("1", "2","3")
employee_attributes <- c("employee_attribute2", "employee_attribute2","employee_attribute1")
group_att_mapping_df <- data.frame(employee_group,employee_attributes)