根据条件将 lookup-table 中的值添加到 R 中的数据框

Adding values from lookup-table based on condition to data frame in R

我有一个数据框,其中包含对图像进行评级的参与者的数据(第 image_index 列):

现在我想添加一个新列,其中包含来自另一个数据框的额定图像的性别特定值。 查找图像数据table:

最终数据框:

我怎样才能完成这个任务?

示例数据:

library(tidyverse)

participants_data <- data.frame(
  ID = c(1,2,3,4),
  gender = c('f','m','d','f'),
  image_index = c(19,2,2,19)
)

lookup_data <- data.frame(
  index = c(2,19),
  male = c(100,110),
  female = c(150,125),
  diverse = c(130, 90)
)


complete_dataset <- data.frame(
  ID = c(1,2,3,4),
  gender = c('f','m','d','f'),
  image_index = c(19,2,2,19),
  external_value = c(125,100,130,150)
)

您需要对数据进行一些操作才能join将它们组合在一起。

  1. 使用 tidyr::pivot_longer() 延长 lookup_data 的旋转时间,因此 gender 信息位于一列中以帮助合并。
  2. 使用 dplyr::rename() 确保两个 table 之间的列名相同。
  3. 转换 gender 列,使其只是 1 字母以匹配另一个 table。这里我使用 stringr::str_sub(x, 1,1) 只取字符串的第一个字符。
  4. 然后我用left_join()合并。因为连接列名称已经相同,所以我不需要指定。
  5. 最后,我只是重新排序和排序数据以匹配您的预期输出。
library(tidyverse)

participants_data <- data.frame(
  ID = c(1,2,3,4),
  gender = c('f','m','d','f'),
  image_index = c(19,2,2,19)
)

lookup_data <- data.frame(
  index = c(2,19),
  male = c(100,110),
  female = c(150,125),
  diverse = c(130, 90)
)

lookup_data %>% 
  pivot_longer(-index, names_to = "gender", values_to = "external_value") %>% 
  rename(image_index = index) %>% 
  mutate(gender = str_sub(gender, 1, 1)) %>% 
  left_join(., participants_data) %>% 
  drop_na(ID) %>% 
  select(ID, gender, image_index, external_value) %>% 
  arrange(ID)
#> Joining, by = c("image_index", "gender")
#> # A tibble: 4 x 4
#>      ID gender image_index external_value
#>   <dbl> <chr>        <dbl>          <dbl>
#> 1     1 f               19            125
#> 2     2 m                2            100
#> 3     3 d                2            130
#> 4     4 f               19            125

reprex package (v2.0.1)

于 2022-02-18 创建