如何比较R中两个单独数据帧的列名?

问题描述

我在R中有2个数据帧,带有表观遗传数据。要在glmnet软件包中将其中一个用作训练集,将另一个用作测试集,则必须匹配列号。由于两个数据框都包含超过800000列,因此我正在寻找一种比较两个数据框的names列的方法,以便可以删除这两个数据框没有共同点的列。到目前为止,我只发现了将两个数据帧的行彼此进行比较的包和函数。 例如,我正在寻找这样的东西:

df1
participant_code cg123  cg122  cg121  cg120

df2
participant_code cg123  cg122  cg121  cg119

函数会给我例如一张表格,其中告诉我哪些姓氏不同:

colname 5 differs

对于任何有关我的问题的建议或对如何使我的帖子在这里更易于理解的反馈,我将不胜感激。

解决方法

您正在寻找两个数据框的列名的交集。您只需使用命令intersect即可实现所需的功能。首先,您提取两个数据帧的名称。然后,您使用intersectintersect的结果包含两个数据帧之一中的列名。使用该对象作为初始数据帧的子集,就可以完成。

# define data frames with dummy data
df1 <- data.frame(participant_code = 1,cg123            = 2,cg122            = 3,cg121            = 4,cg120            = 5)

df2 <- data.frame(participant_code = 6,cg123            = 7,cg122            = 8,cg121            = 9,cg119            = 10)

# extract column names of the data frames
cols_df_1 <- names(df1)
cols_df_2 <- names(df2)

# find the intersection of both column name vectors
cols_intersection <- intersect(cols_df_1,cols_df_2)

# subset the initial data frames
df1_sub <- df1[,cols_intersection]
df2_sub <- df2[,cols_intersection]

# print to console and see result
df1_sub
#participant_code cg123 cg122 cg121
#               1     2     3     4

df2_sub
#participant_code cg123 cg122 cg121
#               6     7     8     9
,

您可以使用intersect从两个数据框中获取公用列。

get_common_cols <- function(df1,df2)  intersect(names(df1),names(df2))

您可以在函数中传递两个数据框以获取相似的列,并使用它来对数据框进行子集化

common_cols <- get_common_cols(data1,data2)
data1 <- data1[,common_cols]
data2 <- data2[,common_cols]
,

这可能不适用于海量数据帧,但是最近我从新的compare()包开始拥护waldo

这将显示两者之间差异的输出。再次,对于800k长度的向量可能是无法理解的,但我认为值得指出。

library(waldo)

compare(names(df1),names(df2)