x<- split(mtcars,mtcars$cyl)
sapply(x,'[',"mpg")
"Из приведенного выше кода может кто-нибудь объяснить мне, почему я могу получить следующий результат и почему добавление '['
в sapply
может привести к следующему результату?"
$`4.mpg`
[1] 22.8 24.4 22.8 32.4 30.4 33.9 21.5 27.3 26.0 30.4 21.4
$`6.mpg`
[1] 21.0 21.0 21.4 18.1 19.2 17.8 19.7
$`8.mpg`
[1] 18.7 14.3 16.4 17.3 15.2 10.4 10.4 14.7 15.5 15.2 13.3 19.2 15.8 15.0
1 ответ
Если вы посмотрите на аргументы для sapply()
, вы увидите, что первые три безымянных аргумента, переданные ему, будут обрабатываться как входные данные (X
), функция, которая будет применяться (FUN
) и дополнительные аргументы для передачи этой функции (...
)
> args('sapply')
function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
> help('sapply')
...
X: a vector (atomic or list) or an ‘expression’ object. Other
objects (including classed objects) will be coerced by
‘base::as.list’.
FUN: the function to be applied to each element of ‘X’: see
‘Details’. In the case of functions like ‘+’, ‘%*%’, the
function name must be backquoted or quoted.
...: optional arguments to ‘FUN’.
Поэтому, когда вы вызываете sapply(x,'[',"mpg")
в списке, полученном в результате разделения на mpg
, вы фактически вызываете оператор индексации [
для каждого элемента в списке и передаете строку mpg
к нему, например:
x$`4`['mpg']
mpg
Datsun 710 22.8
Merc 240D 24.4
Merc 230 22.8
Fiat 128 32.4
Honda Civic 30.4
Toyota Corolla 33.9
Toyota Corona 21.5
Fiat X1-9 27.3
Porsche 914-2 26.0
Lotus Europa 30.4
Volvo 142E 21.4
Наконец, в процессе сборки результатов обратно в список имена теряются, поэтому вы получаете:
$`4.mpg`
[1] 22.8 24.4 22.8 32.4 30.4 33.9 21.5 27.3 26.0 30.4 21.4
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.
help('[')
.[
также является функцией. Прочтите это.