有没有一种简单的方法可以在数据框中配对唯一的数据点?

时间:2014-11-27 10:28:32

标签: r combinations

我想从数据框中提取数据对,在这些数据框中,它们与不在自己的列中的数据配对。第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")

3 个答案:

答案 0 :(得分:3)

以下是使用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"))

您还可以通过引用转换回data.frame(如果您希望使用setDF()

完全匹配所需的输出“
setDF(res)

答案 1 :(得分:1)

此处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

答案 2 :(得分:1)

另一种方法:

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]]), ]