Объедините два фрейма данных на основе общих имен столбцов

У меня есть 2 фрейма данных:

df1 (все гены и значения их экспрессии - каждое имя столбца является геном)

df2 (список генов для анализа - каждый ген представляет собой имя столбца без каких-либо дополнительных данных)

И в основном я хочу объединить их по именам столбцов, получив третий фрейм данных, который является df1, но только с генами, присутствующими в обоих фреймах данных (общие имена столбцов).

Я не знаю, хорошо ли я объяснил, но дайте мне знать, если я могу предоставить дополнительную информацию.

Пример фреймов данных:

df1 <- data.frame(matrix(ncol = 4, nrow = 0))
x1 <- c("name", "school", "job", "gender")
colnames(df1) <- x1

df2 <- data.frame(matrix(ncol = 3, nrow = 0))
x2 <- c("name", "age", "gender")
colnames(df2) <- x2

В основном здесь мне нужен df1, но он сокращен до столбцов, присутствующих как в df1, так и в df2, и это будет «имя» и «пол». Но в моей работе у меня много генов, поэтому я не могу делать это ген за геном.

Спасибо!


person Nuno Ramalho    schedule 24.03.2020    source источник
comment
Вы можете показать несколько примеров данных   -  person akrun    schedule 25.03.2020
comment
Думаю, я сделал это сейчас. Спасибо   -  person Nuno Ramalho    schedule 25.03.2020
comment
он показывает data.frame с 0 строками. Можете ли вы попробовать просто merge(df1, df2), и он будет сливаться по общим именам   -  person akrun    schedule 25.03.2020
comment
df1 имеет 136 строк (значений), а df2 имеет 0 строк, потому что это список, преобразованный как фрейм данных. Если я объединю, это даст мне новый фрейм данных с 0 строками и каждым столбцом на df1 ... и я хочу обратного: каждую строку на df1 и только общие столбцы (имена столбцов) между df1 и df2.   -  person Nuno Ramalho    schedule 25.03.2020
comment
Идеально! Большое вам спасибо, и мне очень жаль, если я сначала неправильно объяснил.   -  person Nuno Ramalho    schedule 25.03.2020


Ответы (1)


Мы можем использовать intersect в именах столбцов как 'df1', так и 'df2', чтобы выбрать столбцы 'df1'

df1new <- df1[intersect(names(df1), names(df2))]

Или с dplyr

library(dplyr)
df1new <- df1 %>%
            select(intersect(names(.), names(df2))
person akrun    schedule 24.03.2020