【问题标题】:Shuffling tables in an ordered way以有序的方式洗牌
【发布时间】:2021-10-14 12:18:38
【问题描述】:

我真的不确定是否有我想要做的事情的技术术语,所以我会尽量清楚。

我目前有 18 个 2x9 = 18 个单元格的表格。这些是我将在实验中使用的令牌集。

这些表中的每一个都有不同的语言上下文,尤其是不同的主要动词。例如,这是我的前两个表:

...等等总共18次。

我想做的是“打乱”这些表,以便每个表包含 18 个原始条件中的每个条件之一,并且没有条件重复两次。

例如,单元格 1 将显示“您将可以享受...”,单元格 2 将显示“他会爬...”,依此类推,在第一个表格中,第二个表格将移动这些上下文在一个单元格中。

我不确定如何自动执行此操作(手动操作非常痛苦)。有没有办法在 R 中做到这一点?

至关重要的是,我不是试图随机化。有一种有序的方式来打乱表格。

一切顺利,

卡梅隆

【问题讨论】:

  • 假设您将单元格的当前索引作为向量 x 并将单元格的所需索引作为向量 y,您可以这样做 x[order(match(x,y))]
  • 谢谢。我不确定我是否真的了解y 会是什么。因为我希望自动定义它。在第一个结果表中,您将拥有原始表 1 的单元格 1,原始表 2 的单元格 2 (...) 原始表 18 的单元格 18。在第二个结果表中,您不能拥有任何单元格用过的。所以它转到原始表 2 的单元格 1 (...) 原始表 1 的单元格 18。直到您一无所有,并且所有 18 个表都已用所有唯一单元格重新排序。
  • 好的,我想我明白你现在想要做什么了。从每个原始表格中,您需要一个结果表格,其中第一个单元格是表格 n 的第一个单元格,其中 n 是原始表格的编号。例如,第五个结果表的第一个单元格将取自第五个原始表的第一个单元格。然后第五个结果表的第二个单元格将是第六个结果表的单元格 2,等等。对吗?
  • 是的,我认为这是正确的,尽管我们没有义务选择每个表格的第一个单元格作为起点。不确定我是否清楚。
  • 嗯。如果您没有义务选择第一个单元格作为起点,那不会给它带来一些随机性吗?你怎么知道从哪个单元格开始?只要不为其他表重复就没有关系吗?

标签: r dataframe dplyr character tidyverse


【解决方案1】:

首先我重新创建了您的表格,使用基本 R 的 sentences 对象来模拟每个单元格:

start_index <- seq(1,18*18,18)
end_index <- seq(18,18*18,18)
for (i in 1:18){
  tables[[i]] <- sentences[start_index[i]:end_index[i]]
}

然后编写一个函数来循环它们,使用表索引作为参数:

tablemaker <- function(n){
  new_table <- list()
  for (i in 1:18){
      new_table[i] <- tables[[ifelse(n-1+i > 18,n-1+i-18 ,n-1+i)]][i] 
  }
  return(new_table)
}

之后,我们可以映射它们:

new_tables <- purrr::map(1:18, tablemaker)

然后检查以确保所有单元格仍然是唯一的:

> 18*18
[1] 324
> length(unique(unlist(new_tables)))
[1] 324
> length(unique(unlist(tables)))
[1] 324

【讨论】:

  • 非常感谢!
  • 当然!从技术上讲,我编写的函数并不是最佳实践,因为您实际上不应该在函数中有循环。但由于您只使用少量表,这应该不是问题。
【解决方案2】:

这个怎么样:

tab1 <- matrix(paste("cell", 1:18, ", table 1"), ncol=2)
tab2 <- matrix(paste("cell", 1:18, ", table 2"), ncol=2)
tab3 <- matrix(paste("cell", 1:18, ", table 3"), ncol=2)
tab4 <- matrix(paste("cell", 1:18, ", table 4"), ncol=2)
tab5 <- matrix(paste("cell", 1:18, ", table 5"), ncol=2)
tab6 <- matrix(paste("cell", 1:18, ", table 6"), ncol=2)
tab7 <- matrix(paste("cell", 1:18, ", table 7"), ncol=2)
tab8 <- matrix(paste("cell", 1:18, ", table 8"), ncol=2)
tab9 <- matrix(paste("cell", 1:18, ", table 9"), ncol=2)
tab10 <- matrix(paste("cell", 1:18, ", table 10"), ncol=2)
tab11 <- matrix(paste("cell", 1:18, ", table 11"), ncol=2)
tab12 <- matrix(paste("cell", 1:18, ", table 12"), ncol=2)
tab13 <- matrix(paste("cell", 1:18, ", table 13"), ncol=2)
tab14 <- matrix(paste("cell", 1:18, ", table 14"), ncol=2)
tab15 <- matrix(paste("cell", 1:18, ", table 15"), ncol=2)
tab16 <- matrix(paste("cell", 1:18, ", table 16"), ncol=2)
tab17 <- matrix(paste("cell", 1:18, ", table 17"), ncol=2)
tab18 <- matrix(paste("cell", 1:18, ", table 18"), ncol=2)

l <- list(
    tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8, tab9, 
    tab10, tab11, tab12, tab13, tab14, tab15, tab16, tab17, tab18)

newtabs <- lapply(1:9, function(i)t(sapply(l, function(x)x[i, ])))

newtabs 对象将是一个列表,其中每个元素都是您想要的表之一。例如,在上面,第一个表是:

> newtabs[[1]]
      [,1]                [,2]                
 [1,] "cell 1 , table 1"  "cell 10 , table 1" 
 [2,] "cell 1 , table 2"  "cell 10 , table 2" 
 [3,] "cell 1 , table 3"  "cell 10 , table 3" 
 [4,] "cell 1 , table 4"  "cell 10 , table 4" 
 [5,] "cell 1 , table 5"  "cell 10 , table 5" 
 [6,] "cell 1 , table 6"  "cell 10 , table 6" 
 [7,] "cell 1 , table 7"  "cell 10 , table 7" 
 [8,] "cell 1 , table 8"  "cell 10 , table 8" 
 [9,] "cell 1 , table 9"  "cell 10 , table 9" 
[10,] "cell 1 , table 10" "cell 10 , table 10"
[11,] "cell 1 , table 11" "cell 10 , table 11"
[12,] "cell 1 , table 12" "cell 10 , table 12"
[13,] "cell 1 , table 13" "cell 10 , table 13"
[14,] "cell 1 , table 14" "cell 10 , table 14"
[15,] "cell 1 , table 15" "cell 10 , table 15"
[16,] "cell 1 , table 16" "cell 10 , table 16"
[17,] "cell 1 , table 17" "cell 10 , table 17"
[18,] "cell 1 , table 18" "cell 10 , table 18"

【讨论】:

  • 谢谢。我不确定这是否正是我所需要的。我需要每个表格中的单元格 1 到 18,对于第一个表格,如下所示:单元格 1,表格 1,单元格 2,表格 2,[...] 单元格 18,表格 18 然后在第二个表格中,我们向下移动一个单元格,因为我们不希望已使用的单元格:单元格 1、表格 2、单元格 2、表格 3 [...] 单元格 18、表格 1 等等,直到我们拥有所有具有唯一单元格的重新排序的表格。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2012-09-01
  • 2014-11-02
  • 2019-02-10
相关资源
最近更新 更多