【问题标题】:How to calculate difference between columns in different data frames with similar pattern in column names?如何计算列名中具有相似模式的不同数据框中的列之间的差异?
【发布时间】:2019-08-20 17:00:23
【问题描述】:

我想计算两个数据框中的列之间的差异。数据框具有不同的总列数,并且数据框之间的列名称具有相似的模式。我想计算名称相似的列之间的差异。

我会很感激一些关于如何开始考虑在 R 或一些示例代码中执行此操作的提示。

以下是数据框的示例:

DF1

w_H_11_XA    w_H_13_XA    w_H_16_XA    w_13_03_XA    w_13_12_XA
10           12          1                8           12
11           11          8                6           19

DF2

w_H_11_BA    w_H_16_BA     w_13_12_BA
8            1            10
9            4            9

因此,这两个数据集都有“共同”列 w_H_11*、w_H_16* 和 w_13_12*,这意味着它们在列名中具有相似的模式。我想生成一个数据集,它只获取相似匹配列之间的差异。像这样:

w_H_11    w_H_16    w_13_12
2          0         2
2          4         10

我考虑过合并数据框并按名称顺序排列列;但是,我不确定如何自动计算差异。实际的数据集有几百列。

如果有任何反馈,我们将不胜感激。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    如果两个名字的区别只是最后一个字符,那么我们可以使用adist

     a = which(adist(names(DF1),names(DF2))==1,T) 
     result = DF1[,a[,1]]-DF2[,a[,2]]
     setNames(result,sub("_[A-Z]$",'',names(result)))
      w_H_11 w_H_16 w_13_12
    1      2      0       2
    2      2      4      10
    

    使用更新后的表格,我们似乎删除了所有字母,因此您可以这样做:

    a = which(do.call(adist,lapply(list(names(DF1),names(DF2)),sub,pat="_[^_]*$",rep=""))==0,T) 剩下的就剩下了

    【讨论】:

    • 所以列名之​​间的唯一区别实际上是最后两个字母(我在示例中进行了更改)以及一个数据集中的某些列不在另一个数据集中的事实.
    • 谢谢!这有效,并没有给我使用 grep 的相同问题(在相似性方面)!
    【解决方案2】:

    一个选项是从列名中删除后缀部分,然后执行 intersect 并使用它来子集 data.frame 的列并获取差异

    nm1 <- sub("_[A-Z]$", "", names(DF1))
    nm2 <- sub("_[A-Z]$", "", names(DF2))
    nm3 <- intersect(nm1, nm2)
    nm4 <- paste(nm3, collapse="|")
    out <- DF1[grep(nm4, names(DF1))] - DF2[grep(nm4, names(DF2))]
    names(out) <- sub("_[A-Z]$", "", names(out))
    out
    #  w_H_11 w_H_16 w_13_12
    #1      2      0       2
    #2      2      4      10
    

    数据

    DF1 <- structure(list(w_H_11_A = 10:11, w_H_13_A = 12:11, w_H_16_A = c(1L, 
    8L), w_13_03_A = c(8L, 6L), w_13_12_A = c(12L, 19L)), class = "data.frame",
    row.names = c(NA, 
    -2L))
    
    DF2 <- structure(list(w_H_11_B = 8:9, w_H_16_B = c(1L, 4L), 
        w_13_12_B = 10:9), class = "data.frame", row.names = c(NA, 
    -2L))
    

    【讨论】:

    • 非常感谢 - 我尝试了这个并一直到执行减法的最后一步。但是,似乎在 DF1 上使用 grep 最终会识别出额外的两列。我的意思是 intersect(nm1, nm2) 的列数是 1682,但是当我使用 grep 对 DF1 进行子集时,我得到 1684 列。因此,似乎 DF1 中有几列足够相似,grep 正在挑选它们。当我在 grep 中使用 fixed = TRUE 时,我得到 0 列...
    • @AnnaY。它基于您的示例。关于其他栏目,帖子中没有提到
    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多