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



我在R中有两个具有表观遗传学数据的数据帧。要在glmnet包中将其中一个用作训练集,另一个用作测试集,列号(如果必须匹配(。由于两个数据帧都包含超过800000列,我正在寻找一种方法来比较这两个数据框架的名称列,这样我就可以删除两者没有共同点的列。到目前为止,我只找到了将两个数据帧的行相互比较的包和函数。举个例子,我正在寻找这样的东西:

df1
participant_code cg123  cg122  cg121  cg120
df2
participant_code cg123  cg122  cg121  cg119

该函数会给我一个表,它在表中显示了哪些colname不同:

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]

对于一个巨大的数据帧来说,这可能不是最好的方法,但我最近已经成为新waldo包中compare()的粉丝。

这将显示两者之间的差异输出。同样,对于800k长度的向量来说,这可能是不可破译的,但我认为这是值得指出的。

library(waldo)
compare(names(df1), names(df2)

最新更新