перейти к списку наборов данных left_join - PullRequest
1 голос
/ 26 февраля 2020

У меня есть два списка наборов данных, которые я хочу left_join. Они упорядочены, поэтому первый набор данных на list1 должен быть объединен с первым набором данных на list2, второй на list1 со вторым на list2 и так далее. Я пытался сделать это с lapply, но я получаю следующее сообщение об ошибке:

enter image description here

Вот некоторые примеры данных:

set.seed(1234)

n1 <- LETTERS[1:10]
x1 <- rnorm(10,1) 
y1 <- rnorm(10,2)
z1 <- rnorm(10,3)

n2 <- LETTERS[5:14]
x2 <- rnorm(10,1) 
y2 <- rnorm(10,2)
z2 <- rnorm(10,3)

df1 <- data.frame(n1,x1,y1,z1)  
df2 <- data.frame(n2,x2,y2,z2)  
list1 <- list(df1, df2)

n1 <- LETTERS[5:14]
x3 <- rnorm(10,2) 
y3 <- rnorm(10,3)
z3 <- rnorm(10,4)

n2 <- LETTERS[1:10]
x4 <- rnorm(10,2) 
y4 <- rnorm(10,3)
z4 <- rnorm(10,4)

df3 <- data.frame(n1,x3,y3,z3)  
df4 <- data.frame(n2,x4,y4,z4)  
list2 <- list(df3, df4)

А вот код, который я пытаюсь заставить работать:

lapply(list1, function(x) left_join(x, list2[[x]]))

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Используя purrr, вы можете сделать:

map2(.x = list1, 
     .y = list2, 
     ~ left_join(.x, .y))

[[1]]
   n1         x1       y1       z1       x3       y3       z3
1   A -0.2070657 1.522807 3.134088       NA       NA       NA
2   B  1.2774292 1.001614 2.509314       NA       NA       NA
3   C  2.0844412 1.223746 2.559452       NA       NA       NA
4   D -1.3456977 2.064459 3.459589       NA       NA       NA
5   E  1.4291247 2.959494 2.306280 2.656588 3.006893 3.822210
6   F  1.5060559 1.889715 1.551795 4.548991 2.544531 3.830006
7   G  0.4252600 1.488990 3.574756 1.965240 2.633476 2.627698
8   H  0.4533681 1.088805 1.976344 1.330366 3.648287 3.826213
9   I  0.4355480 1.162828 2.984862 1.992395 5.070271 4.850232
10  J  0.1099622 4.415835 2.064051 3.777084 2.846602 4.697609

[[2]]
   n2         x2        y2       z2       x4       y4       z4
1   E  2.1022975 3.4494963 1.193969 1.504417 2.174001 4.022363
2   F  0.5244069 0.9313573 2.417924 2.355550 3.166989 4.831141
3   G  0.2905600 1.1446354 1.891110 0.865392 2.103735 2.755712
4   H  0.4987419 1.7193770 1.985038 2.878204 3.168185 4.169026
5   I -0.6290935 1.0056599 2.837690 2.972917 3.354968 4.673166
6   J -0.1676193 1.0314857 3.563056 4.121117 2.947895 3.973724
7   K -1.1800396 0.8926818 4.647817       NA       NA       NA
8   L -0.3409932 0.7480141 2.226647       NA       NA       NA
9   M  0.7057061 1.4761719 4.605910       NA       NA       NA
10  N  0.5341025 1.5031500 1.842191       NA       NA       NA
2 голосов
/ 26 февраля 2020

Я думаю, вы должны использовать Map здесь:

Map(dplyr::left_join, list1, list2)

Чтобы использовать lapply, вы могли бы l oop над индексом.

lapply(seq_along(list1), function(x) dplyr::left_join(list1[[x]], list2[[x]]))
1 голос
/ 26 февраля 2020

Должно быть mapply вместо lapply:

mapply(left_join, list1, list2, SIMPLIFY = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...