【问题标题】:Is there a simple way of pairing unique data points in a data frame?有没有一种简单的方法来配对数据框中的唯一数据点?
【发布时间】:2014-11-27 10:28:31
【问题描述】:

我想从数据框中提取成对的数据,它们与不在自己列中的数据配对。第 1 列中的每个数字都与该列右侧的所有数字配对。同样,第 2 列中的数字仅与第 3 列或以上的数字配对。

我创建了一个使用“for”循环的鸟巢来执行此操作的脚本,但我觉得应该有一种更优雅的方式来执行此操作。

示例数据:

structure(list(A = 1:3, B = 4:6, C = 7:9), .Names = c("A", "B", 
          "C"), class = "data.frame", row.names = c(NA, -3L))

期望的输出:

structure(list(X1 = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 
          3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6), X2 = c(4, 5, 6, 7, 
          8, 9, 4, 5, 6, 7, 8, 9, 4, 5, 6, 7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 
          8, 9)), .Names = c("X1", "X2"), row.names = c(NA, 27L), class = "data.frame")

【问题讨论】:

    标签: r combinations


    【解决方案1】:

    这是一种使用data.table 包及其非常高效的CJrbindlist 函数的方法(假设您的数据集名为df

    library(data.table)
    res <- rbindlist(lapply(seq_len(length(df) - 1), 
            function(i) CJ(df[, i], unlist(df[, -(seq_len(i))]))))
    

    然后您可以使用setnames通过引用设置列名(如果您坚持使用“X1”和“X2”)

    setnames(res, 1:2, c("X1", "X2"))
    

    您还可以使用setDF()通过引用转换回data.frame(如果您想“完全”匹配所需的输出)

    setDF(res)
    

    【讨论】:

    • 谢谢 - 所有建议都有效,这似乎是最优雅的,但我很难完全掌握其中任何一个的工作原理。
    • @David Arenburg 确实,这很优雅
    • 这个很简单。我们遍历所有列(最后一列除外)并将它们与所有其余列交叉连接(从当前列到末尾)。当我们使用unlist 时,我们基本上是将数据框转换为一列并交叉连接到它。然后我们用rbindlist把所有东西放在一起
    【解决方案2】:

    这里df是输入dataset

    out1 <- do.call(rbind,lapply(1:(ncol(df)-1), function(i) {
                   x1 <- df[,i:(ncol(df))]
                   Un1 <-unique(unlist(x1[,-1]))
               data.frame(X1=rep(x1[,1], each=length(Un1)), X2= Un1)}))
    
     all.equal(out, out1) #if `out` is the expected output
     #[1] TRUE
    

    【讨论】:

      【解决方案3】:

      另一种方法:

      res <- do.call(rbind, unlist(lapply(seq(ncol(dat) - 1), function(x) 
        lapply(seq(x + 1, ncol(dat)), function(y) 
          "names<-"(expand.grid(dat[c(x, y)]), c("X1", "X2")))),
        recursive = FALSE))
      

      dat 是您的数据框的名称。

      您可以使用以下命令对结果进行排序:

      res[order(res[[1]], res[[2]]), ]
      

      【讨论】:

        猜你喜欢
        • 2020-10-18
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        • 2022-01-15
        • 2011-06-17
        • 2011-08-01
        相关资源
        最近更新 更多