根据条件将 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
将它们组合在一起。
- 使用
tidyr::pivot_longer()
延长 lookup_data
的旋转时间,因此 gender
信息位于一列中以帮助合并。
- 使用
dplyr::rename()
确保两个 table 之间的列名相同。
- 转换
gender
列,使其只是 1
字母以匹配另一个 table。这里我使用 stringr::str_sub(x, 1,1)
只取字符串的第一个字符。
- 然后我用
left_join()
合并。因为连接列名称已经相同,所以我不需要指定。
- 最后,我只是重新排序和排序数据以匹配您的预期输出。
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 创建
我有一个数据框,其中包含对图像进行评级的参与者的数据(第 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
将它们组合在一起。
- 使用
tidyr::pivot_longer()
延长lookup_data
的旋转时间,因此gender
信息位于一列中以帮助合并。 - 使用
dplyr::rename()
确保两个 table 之间的列名相同。 - 转换
gender
列,使其只是1
字母以匹配另一个 table。这里我使用stringr::str_sub(x, 1,1)
只取字符串的第一个字符。 - 然后我用
left_join()
合并。因为连接列名称已经相同,所以我不需要指定。 - 最后,我只是重新排序和排序数据以匹配您的预期输出。
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 创建