我想从数据帧中提取数据对,其中数据对与不在自己列中的数据配对。第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")
这是一种使用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))]))))
然后,您可以使用以下命令通过引用设置列名(如果您坚持使用“ X1”和“ X2”) setnames
setnames(res, 1:2, c("X1", "X2"))
您还可以通过使用转换回data.frame
引用(如果您想“完全”匹配所需的输出)setDF()
setDF(res)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句