生成样本值的 data.frame,其中列频率相同

问题描述 投票:0回答:1

我正在尝试找出如何自动创建这样的矩阵或数据框。在此示例中,每行都是 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,即使它不包含所有可能的排列(例如第二个示例)。 大家有什么想法吗?

r dataframe
1个回答
0
投票

这应该可以。我确信以前已经做过类似的事情,但我的第一个想法是使用

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
© www.soinside.com 2019 - 2024. All rights reserved.