3
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?当然,它不会是完全相同的向量,但必须遵守A比较的顺序。B是否有意义?

4

1 回答 1

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在转换tabledata.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
于 2013-11-07T16:55:18.483 回答