从交互表中查找原始向量

时间:2013-11-07 16:48:28

标签: r r-table

A = c(1,2,3,2,1,2,2,2,1,2,3,2,1)
B = c(2,3,2,3,2,2,1,1,2,1,2,2,3)
mytable = table(A,B)

mytable找回两个向量的最佳解决方案是什么?当然,它不是完全相同的向量,但必须尊重AB相比的顺序。它有意义吗?

1 个答案:

答案 0 :(得分:5)

您可以使用data.framerep

X <- as.data.frame(mytable)
X[] <- lapply(X, function(z) type.convert(as.character(z)))
Y <- X[rep(rownames(X), X$Freq), 1:2]
Y
#     A B
# 2   2 1
# 2.1 2 1
# 2.2 2 1
# 4   1 2
# 4.1 1 2
# 4.2 1 2
# 5   2 2
# 5.1 2 2
# 6   3 2
# 6.1 3 2
# 7   1 3
# 8   2 3
# 8.1 2 3

Y$A包含与A相同的值,Y$B包含与B相同的值。

all.equal(sort(Y$A), sort(A))
# [1] TRUE
all.equal(sort(Y$B), sort(B))
# [1] TRUE

或者,@ Matthew的评论:

X <- data.matrix(data.frame(mytable))
X[rep(sequence(nrow(X)), X[, "Freq"]), 1:2]

这种情况下的结果是一个双列矩阵。


更新(超过一年后)

expandRows转换为table后,您也可以使用我的“splitstackshape”包中的data.table。请注意,它还会向您提供有关哪些组合具有零值的消息,因此在扩展为长格式时会被删除。

library(splitstackshape)
expandRows(as.data.table(mytable), "N")
# The following rows have been dropped from the input: 
# 
# 1, 3, 9
# 
#     A B
#  1: 2 1
#  2: 2 1
#  3: 2 1
#  4: 1 2
#  5: 1 2
#  6: 1 2
#  7: 2 2
#  8: 2 2
#  9: 3 2
# 10: 3 2
# 11: 1 3
# 12: 2 3
# 13: 2 3