【问题标题】:How can I compare column names of two separate data frames in R?如何比较 R 中两个单独数据框的列名?
【发布时间】:2021-02-18 05:08:37
【问题描述】:

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

df1
participant_code cg123  cg122  cg121  cg120

df2
participant_code cg123  cg122  cg121  cg119

该功能会给我然后例如一个表格,其中显示了哪些列名不同:

colname 5 differs

如果对我的问题提出任何建议,或者就如何使我的帖子更易于理解提供反馈,我将不胜感激。

【问题讨论】:

    标签: r compare glmnet columnname


    【解决方案1】:

    您正在寻找两个数据框的列名的交集。您可以简单地使用命令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 函数提供了数据框。但是,它确实只适用于向量。并且向量应该包含数据框列的名称。我更新了答案以使其更清晰,甚至引入了虚拟数据框。
    【解决方案2】:

    这对于一个巨大的数据框可能不是最好的,但我最近从新的waldo 包中成为了compare() 的粉丝。

    这将显示两者之间差异的输出。同样,对于 800k 长度的向量可能难以理解,但我认为值得指出。

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

    【讨论】:

      【解决方案3】:

      您可以使用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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-10
        • 1970-01-01
        • 2017-07-30
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多