Слияние двух df Один ко Многим в Списке - R - PullRequest
0 голосов
/ 13 июня 2018

Для начала я проигнорирую использование списков и покажу, что я хочу, используя два df.

У меня есть df1

ID    v1    Join_ID
1     100     1
2     110     2
3     150     3

И df2

Join_ID    Type    v2
1          a       80
1          b       90
2          a       70
2          b       60
3          a       50
3          b       40

Я хочу, чтобы df.join было:

ID     v1    Join_ID    a_v2    b_v2
1      100       1       80      90
2      110       2       70      60
3      150       3       50      40

Я пытался:

df.merged <- merge(df1, df2, by="Join_ID")
df.wide <- dcast(melt(df.merged, id.vars=c("ID", "type")), ID~variable+type)

Но это повторяет все переменные в df1 для каждого типа: v1_a v1_b

Кроме того, у меня есть два списка

list.1
df1_a
df1_b
df1_c

list.2
df2_a
df2_b
df2_c

И я хочу, чтобы df1_a в списке 1 присоединился к df2_a в списке 2

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Некоторые ответы на ваш запрос:1. изменение формы df22. объединение с разными именами столбцов

library (reshape2)

    df1=data.frame(id=c(1,2,3), v1=c(100,110,150))
    df2=data.frame(Join_ID=c(1,1,2,2,3,3),Type=c("a","b","a","b","a","b"),v2=c(80,90,70,60,50,40))

    cast_df2=dcast(df2, Join_ID ~ Type)
    mergedData <- full_join(df1,cast_df2, by=c("id"="Join_ID"),suffixes=c("_df1","_df2") )
0 голосов
/ 13 июня 2018

Мы можем сделать это с map через элементы list и затем выполнить объединение

library(tidyverse)
map2(list.1, list.2, ~ 
           .y %>%
              mutate(Type = paste0(Type, "_v2")) %>%
              spread(Type, v2) %>% 
              inner_join(.x, by = 'Join_ID'))

data

df1 <- structure(list(ID = 1:3, v1 = c(100L, 110L, 150L), Join_ID = 1:3), 
   .Names = c("ID", 
"v1", "Join_ID"), class = "data.frame", row.names = c(NA, -3L
))

df2 <- structure(list(Join_ID = c(1L, 1L, 2L, 2L, 3L, 3L), Type = c("a", 
"b", "a", "b", "a", "b"), v2 = c(80L, 90L, 70L, 60L, 50L, 40L
)), .Names = c("Join_ID", "Type", "v2"), class = "data.frame", row.names = c(NA, 
-6L))

list.1 <- list(df1_a = df1, df1_b = df1, df1_c = df1)
list.2 <- list(df2_a = df2, df2_b = df2, df2_c = df2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...