2016-02-09 3 views
-1

У меня есть два кадра данных:объединить два кадра данных два колонн

df1 <- data.frame(x1=c("a","b","z","u"), 
        x2=c("f", "a","d","x")) 

df2 <- data.frame(x=letters[1:10],y=1:10,z=11:20) 

Теперь я хочу, чтобы объединить их x1, x2 и х, т.е. если буква х в любом x1 или x2 соответствующих y и z следует добавить. Если доступны два варианта, x1 следует использовать в качестве ссылки.

df1 должен быть «основным» набором данных (например, all.x = TRUE аргумент).

окончательный кадр данных здесь будет

x1 x2 y z 
a f 1 11 
b a 2 12 
z d 4 14 
u x NA NA 

Я хотел бы видеть, второе решение, которое добавляет столбцы y1, z1 и y2, z2 так:

x1 x2 y1 z1 y2 z2 
    a f 1 11 6 16 
    b a 2 12 1 11 
    z d NA NA 4 14 
    u x NA NA NA NA 

бы оцените merge или dplyr или tidyr раствор

+0

Для вашего второго решения просто left_joining (см. 'Dplyr :: left_join') на x = x1 сначала, а затем снова на x = x2 выполнит трюк. –

ответ

1

Для вашего второго решения вы можете просто использовать два последовательных e слева (например, используя dplyr::left_join).

left_join(df1, df2, by=c("x1"="x")) %>% 
    rename(y1=y, z1=z) %>% 
    left_join(df2, by=c("x2"="x")) %>% 
    rename(y2=y, z2=z) 

дает именно то, что вы хотите.

+0

Не могли бы вы добавить решение, в котором у меня есть более двух столбцов для объединения (здесь y, z). Я не хочу переименовывать 100 столбцов вручную. – spore234

1

Для первого раствора:

df1 %>% 
left_join(df2, by = c("x1"="x")) 

Для второго, см решение по @ Antoine-мешок выше.

Смежные вопросы