Подмножество или фильтр 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