迭代两个数据框以在 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)
我希望通过迭代两个数据框来形成最终数据框。
第一个 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)