Как подмножить многомерную таблицу непредвиденных обстоятельств со значениями вектора (т.е. каждое значение указывает измерение)?

У меня есть многомерная таблица непредвиденных обстоятельств из 4 переменных. И мне нужно получить значения из этой таблицы, используя вектор длины 4. Вся причина для этого состоит в том, чтобы иметь возможность получить огромный список таких векторов и найти соответствующий вывод из таблицы непредвиденных обстоятельств. Есть ли хороший способ преобразовать c(1,2,3,4) в my.table[1,2,3,4]? Вот пример того, что я сейчас делаю только с одним вектором в качестве входных данных:

v = c(1,2,3,4)
my.table = table(my.data.frame[,c("x","y","z","w")])
eval(str2lang(paste0("my.table[", paste0(v, collapse = ", "), "]")))

И это то, что я делаю с большим списком входных векторов, который в моем случае является фреймом данных:

data.frame.of.inputs = data.frame(x = sample(1:4, 100, T), y = sample(1:4, 100, T), 
                                  z = sample(1:4, 100, T), w = sample(1:4, 100, T))
my.table = table(some.other.data.frame[,c("x","y","z","w")])
apply(data.frame.of.inputs,1,function(rw) 
eval(str2lang(paste0("my.table[", paste0(rw, collapse = ", "), "]"))))

Примечание: чтобы запустить этот код, вы можете инициализировать my.data.frame и some.other.data.frame одним и тем же оператором:

data.frame(x = sample(1:4, 100, T), y = sample(1:4, 100, T), 
           z = sample(1:4, 100, T), w = sample(1:4, 100, T))

Мне не нравится мое текущее решение не только потому, что оно уродливое, но и потому, что оно кажется слишком долгим, чтобы сделать что-то простое.

Кроме того, как мой побочный квест: есть ли способ подмножить таблицу с помощью атрибутов (my.table) $variable.name?


person iliya malecki    schedule 12.05.2021    source источник
comment
Мне не совсем понятен смысл вашего побочного квеста: можете ли вы привести пример (вспомнив, что вы можете использовать косвенную адресацию через attributes(my.table)[[var]], где var — вектор символов длины 1...)?   -  person Ben Bolker    schedule 13.05.2021
comment
@BenBolker Я имел в виду, что хочу найти способ получить значения my.table, где x == то-то и то-то, y == то-то и то-то, z == то-то и то-то и так далее. Я понимаю, что могу полагаться на порядок измерений в таблице, но код стал бы более элегантным, если бы я мог пропустить сохранение правильного порядка и просто запросить у таблицы значения в заданных именах измерений. Я попробовал my.table[v], но безуспешно, ведь это массив   -  person iliya malecki    schedule 13.05.2021


Ответы (1)


От 1_:

При индексировании массивов с помощью «[» один аргумент «i» может быть матрицей с количеством столбцов, равным размерности «x»; тогда результатом является вектор с элементами, соответствующими наборам индексов в каждой строке «i».

С одним вектором:

my.table[rbind(v)]

(т. е. преобразовать вектор в однострочную матрицу)

Несколько входов:

my.table[as.matrix(data.frame.of.inputs)]
person Ben Bolker    schedule 12.05.2021
comment
Вау, спасибо большое! этого не знал! Первый вопрос, который сразу же приходит на ум, — как получить вектор, а не значение. Я имею в виду, что с помощью уродливого метода можно выбрать my.table[ , 2, 3, 4] - так что это должно быть возможно и с этим методом, или я так думал. в разделе справки указано, что я могу поставить ноль в матрице, чтобы игнорировать соответствующий столбец, но я действительно не понимаю смысла игнорирования. я попробовал my.table[matrix(c(0,2,3,4),1)] и получил целое число (0) в качестве вывода, что неверно, поскольку таблица содержит значения для этих уровней - person iliya malecki; 13.05.2021
comment
@iliyamalecki, имеющий вектор 2,3,4, недействителен, поскольку вы не знаете, нужен ли вам my.table[,2,3,4], my.table[2,,3,4] или my.table[2,3,,4], вы понимаете, к чему я иду? Итак, если у вас есть вектор, вам нужно указать все размеры. - person Onyambu; 13.05.2021
comment
@Onyambu Я понимаю причины, но не понимаю обходных путей. Почему матрица с 0,2,2,1 не работает должным образом? - person iliya malecki; 13.05.2021
comment
@iliyamalecki нет подмножества 0. например. x<- 1:4; x[0] почему вы сказали как и ожидалось? Нет, не ожидалось - person Onyambu; 13.05.2021
comment
@Onyambu к сожалению, я не слишком хорошо читал документы, оказывается, в случае индексации по матрице 0 приведет к полному исключению этой строки матрицы, а не целевого столбца. Тем не менее, x[matrix(c(0,2)] действителен и даст 2 в качестве вывода - person iliya malecki; 13.05.2021