Упорядоченное перетасование столов

#r #dataframe #dplyr #character #tidyverse

Вопрос:

Я действительно не уверен, есть ли технический термин для того, что я пытаюсь сделать, поэтому я постараюсь быть как можно более ясным.

В настоящее время у меня есть 18 таблиц 2×9 = 18 ячеек. Это наборы токенов, которые я собираюсь использовать в эксперименте.

Каждая из этих таблиц характеризуется различным лингвистическим контекстом, особенно другим основным глаголом. Например, вот мои первые две таблицы:

введите описание изображения здесь

введите описание изображения здесь

… и так далее в общей сложности 18 раз.

Что я хотел бы сделать, так это «перетасовать» эти таблицы так, чтобы каждая таблица содержала по одному условию из 18 исходных условий, и чтобы ни одно условие не повторялось дважды.

Например, в ячейке 1 будет «вам понравится…», в ячейке 2 будет «он мог бы подняться…» и так далее в первой таблице, а вторая таблица переместит эти контексты на одну ячейку вниз.

Я не уверен, как это сделать автоматически (это довольно больно делать вручную). Есть ли какой-нибудь способ сделать это в R?

Важно то, что я не пытаюсь случайничать. Существует упорядоченный способ перетасовки столов.

Всего наилучшего,

Кэмерон

Комментарии:

1. Предполагая , что у вас есть текущие индексы ваших ячеек в виде вектора x и желаемые индексы ваших ячеек в виде вектора y , вы могли бы сделать x[order(match(x,y))]

2. Спасибо. Хотя я не уверен, что действительно понимаю, что y бы это было. Потому что я хочу, чтобы это было определено автоматически. В первой результирующей таблице у вас будет ячейка 1 исходной таблицы 1, ячейка 2 исходной таблицы 2 (…) , ячейка 18 исходной таблицы 18. Во второй результирующей таблице вы не можете использовать ни одну из уже используемых ячеек. Итак, это ячейка 1 исходной таблицы 2 (…) ячейка 18 исходной таблицы 1. Пока у вас ничего не останется, и все 18 таблиц не будут переупорядочены со всеми уникальными ячейками.

3. Ладно, думаю, я понимаю, что ты сейчас пытаешься сделать. Из каждой исходной таблицы вам нужна результирующая таблица, первая ячейка которой является первой ячейкой таблицы n , где n — номер исходной таблицы. Например, первая ячейка пятой результирующей таблицы будет взята из первой ячейки пятой исходной таблицы. И тогда вторая ячейка пятой результирующей таблицы будет ячейкой 2 шестой результирующей таблицы и т. Д. Это правда?

4. Да, я думаю, что это примерно так, хотя мы не обязаны выбирать первую ячейку каждой таблицы в качестве отправной точки. Не уверен, что я ясно выразился.

5. Хм. Если вы не обязаны выбирать первую ячейку в качестве отправной точки, разве это не привносит в нее некоторую случайность? Как вы узнаете, с какой ячейки начать? Разве это не имеет значения до тех пор, пока оно не повторится для других таблиц?

Ответ №1:

Поэтому сначала я воссоздал ваши таблицы, используя sentences объект базы R для имитации каждой ячейки:

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

Затем написал функцию для их перебора, используя индекс таблицы в качестве аргумента:

 tablemaker lt;- function(n){  new_table lt;- list()  for (i in 1:18){  new_table[i] lt;- tables[[ifelse(n-1 i gt; 18,n-1 i-18 ,n-1 i)]][i]   }  return(new_table) }  

После этого мы сможем нанести их на карту:

 new_tables lt;- purrr::map(1:18, tablemaker)  

А затем проверьте, чтобы убедиться, что все ячейки по-прежнему уникальны:

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

Комментарии:

1. Большое спасибо!

2. Конечно! Технически функция, которую я написал, не является лучшей практикой, так как на самом деле у вас не должно быть циклов внутри функций. Но поскольку вы работаете только с небольшим количеством таблиц, это не должно быть проблемой.

Ответ №2:

Как насчет этого:

 tab1 lt;- matrix(paste("cell", 1:18, ", table 1"), ncol=2) tab2 lt;- matrix(paste("cell", 1:18, ", table 2"), ncol=2) tab3 lt;- matrix(paste("cell", 1:18, ", table 3"), ncol=2) tab4 lt;- matrix(paste("cell", 1:18, ", table 4"), ncol=2) tab5 lt;- matrix(paste("cell", 1:18, ", table 5"), ncol=2) tab6 lt;- matrix(paste("cell", 1:18, ", table 6"), ncol=2) tab7 lt;- matrix(paste("cell", 1:18, ", table 7"), ncol=2) tab8 lt;- matrix(paste("cell", 1:18, ", table 8"), ncol=2) tab9 lt;- matrix(paste("cell", 1:18, ", table 9"), ncol=2) tab10 lt;- matrix(paste("cell", 1:18, ", table 10"), ncol=2) tab11 lt;- matrix(paste("cell", 1:18, ", table 11"), ncol=2) tab12 lt;- matrix(paste("cell", 1:18, ", table 12"), ncol=2) tab13 lt;- matrix(paste("cell", 1:18, ", table 13"), ncol=2) tab14 lt;- matrix(paste("cell", 1:18, ", table 14"), ncol=2) tab15 lt;- matrix(paste("cell", 1:18, ", table 15"), ncol=2) tab16 lt;- matrix(paste("cell", 1:18, ", table 16"), ncol=2) tab17 lt;- matrix(paste("cell", 1:18, ", table 17"), ncol=2) tab18 lt;- matrix(paste("cell", 1:18, ", table 18"), ncol=2)  l lt;- list(  tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8, tab9,   tab10, tab11, tab12, tab13, tab14, tab15, tab16, tab17, tab18)  newtabs lt;- lapply(1:9, function(i)t(sapply(l, function(x)x[i, ])))  

newtabs Объектом будет список, где каждый элемент будет одной из нужных вам таблиц. Например, в приведенной выше первой таблице:

 gt; 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. Спасибо. Я не уверен, что именно это мне нужно. Мне понадобятся ячейки с 1 по 18 в каждой таблице, что-то вроде этого для первой таблицы: ячейка 1, таблица 1, ячейка 2, таблица 2, […] ячейка 18, таблица 18 затем во второй таблице мы перемещаемся вниз по ячейке, так как мы не хотим, чтобы ячейки уже использовались: ячейка 1, таблица 2, ячейка 2, таблица 3 […] ячейка 18, таблица 1 И так далее, пока мы не переупорядочим все таблицы со всеми уникальными ячейками.