我想从数据框中提取数据对,在这些数据框中,它们与不在自己的列中的数据配对。第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")
答案 0 :(得分:3)
以下是使用data.table
包及其高效CJ
和rbindlist
函数的方法(假设您的数据集名为df
)
library(data.table)
res <- rbindlist(lapply(seq_len(length(df) - 1),
function(i) CJ(df[, i], unlist(df[, -(seq_len(i))]))))
然后,您可以使用setnames
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]]), ]