#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 И так далее, пока мы не переупорядочим все таблицы со всеми уникальными ячейками.