我正在尝试找出如何自动创建这样的矩阵或数据框。在此示例中,每行都是 1:3 的样本,并且各列必须具有相同的值频率。因此,在此示例中,col1 有 2 个一、2 个二和 2 个三,这对于所有列都适用。没有重复的行。
1 2 3
1 3 2
2 3 1
2 1 3
3 1 2
3 2 1
注意这个矩阵也满足条件
1 2 3
2 3 1
3 1 2
希望将其扩展到更大的矩阵,在其中我可以返回满足标准的 data.frame,即使它不包含所有可能的排列(例如第二个示例)。 大家有什么想法吗?
这应该可以。我确信以前已经做过类似的事情,但我的第一个想法是使用
sample()
为每个值创建 rows_per_value
排列并过滤掉重复项。然后重复此操作n
次。
generate_balanced_matrix <- function(n, num_rows = n) {
# Initialize empty result matrix
result <- matrix(NA, nrow = 0, ncol = n)
# Keep track of how many rows we want starting with each number
rows_per_value <- num_rows/n
# Generate rows starting with each value
for(i in 1:n) {
rows <- matrix(NA, nrow = 0, ncol = n)
while(nrow(rows) < rows_per_value) {
# Generate a new row starting with i
new_row <- c(i, sample((1:n)[-i], n-1))
# Check if this row is unique
if(!any(apply(rows, 1, function(x) all(x == new_row)))) {
rows <- rbind(rows, new_row)
}
}
result <- rbind(result, rows)
}
# Convert to data frame
result <- as.data.frame(result, row.names = F)
names(result) <- paste0("V", 1:n)
return(result)
}
set.seed(123) # for reproducibility
result1 <- generate_balanced_matrix(3, 6)
print(result1)
V1 V2 V3
1 1 2 3
2 1 3 2
3 2 1 3
4 2 3 1
5 3 2 1
6 3 1 2