我在R中有两个具有表观遗传学数据的数据帧。要在glmnet包中将其中一个用作训练集,另一个用作测试集,列号(如果必须匹配(。由于两个数据帧都包含超过800000列,我正在寻找一种方法来比较这两个数据框架的名称列,这样我就可以删除两者没有共同点的列。到目前为止,我只找到了将两个数据帧的行相互比较的包和函数。举个例子,我正在寻找这样的东西:
df1
participant_code cg123 cg122 cg121 cg120
df2
participant_code cg123 cg122 cg121 cg119
该函数会给我一个表,它在表中显示了哪些colname不同:
colname 5 differs
您正在查找两个数据帧的列名的交集。您可以简单地使用命令intersect
来实现您想要的内容。首先提取两个数据帧的名称。然后使用intersect
。intersect
的结果包含两个数据帧中任一数据帧中的列名。将此对象用于初始数据帧的子集,就完成了。
# 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)