С tidyr
, dplyr
и purrr
мы могли бы сделать:
DF <- tidyr::gather(DF, key = "Item", value, -PIN)
purrr::map(List, dplyr::left_join, DF, by = c("PIN", "Item"))
[[1]]
PIN Item value
1 1 a 101
2 2 a 102
3 3 a 103
[[2]]
PIN Item value
1 4 b 204
2 5 b 205
3 6 b 206
Обратите внимание, что вы получите предупреждение, потому что данные примера содержат факторы. Добавьте stringsAsFactors = FALSE
при построении фреймов данных, чтобы избежать этого предупреждающего сообщения.
Вы можете заменить функцию purrr
map
на базовые R lapply
, используя:
lapply(List, dplyr::left_join, DF, by = c("PIN", "Item"))
Кроме того, одной из альтернатив решения Уве может быть:
library(tidyverse)
DF <- gather(DF, key = "Item", value, -PIN)
List %>%
map(mutate_if, is.factor, as.character) %>% # optional, but solves the warning message by converting factors to character
map_df(rbind, .id = "id") %>%
left_join(DF) %>%
split(.$id)
$`1`
id PIN Item value
1 1 1 a 101
2 1 2 a 102
3 1 3 a 103
$`2`
id PIN Item value
4 2 4 b 204
5 2 5 b 205
6 2 6 b 206
Данные:
# Create list
List <- list(
data.frame(PIN = c(1:3), Item = c("a", "a", "a")),
data.frame(PIN = c(4:6), Item = c("b", "b", "b"))
)
# Create data frame
DF <- data.frame(
PIN = c(1:10),
a = c(101:110),
b = c(201:210),
c = c(301:310)
)