Подмножество или фильтр data.frame по индексам, например по столбцам в строке

Предположим, у вас есть такой data.frame:

df <- data.frame(matrix(1:12, 4))
df
  X1 X2 X3
1  1  5  9
2  2  6 10
3  3  7 11
4  4  8 12

которые должны фильтроваться построчно по этим индексам столбцов:

b=c(2,1,3,2)

Таким образом, ожидаемый результат должен быть таким:

c(5, 2, 11, 8)

Использование следующего подхода не является решением, очевидно.

df[ 1:nrow(df), b] 

Пока что я использую подход с mapply, который работает:

mapply(function(x, y)  x[y], as.data.frame(t(df)), b, USE.NAMES = F)
[1]  5  2 11  8

Но мне интересно, есть ли более элегантное решение там?

1 ответ

Решение

Вы можете использовать числовую матричную индексацию; проверьте ?"[" в разделе Матрицы и массивы:

Третья форма индексации - через числовую матрицу с одним столбцом для каждого измерения: каждая строка индексной матрицы затем выбирает отдельный элемент массива, и в результате получается вектор. Отрицательные индексы не допускаются в матрице индексов. Допускаются значения NA и нуля: строки индексной матрицы, содержащие ноль, игнорируются, тогда как строки, содержащие NA, дают в результате NA.

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

b=c(2,1,3,2)

df[cbind(seq_len(nrow(df)), b)]
# [1]  5  2 11  8
Другие вопросы по тегам