Поведение <- NULL в списках по сравнению с data.frames для удаления данных
Многие пользователи R в конце концов находят множество способов удалить элементы из своих данных. Одним из способов является использованиеNULL
особенно, если вы хотите сделать что-то вроде удаления столбца изdata.frame
или удалить элемент изlist
.
В конце концов, пользователь сталкивается с ситуацией, когда он хочет отбросить несколько столбцов изdata.frame
сразу, и они натолкнулись на<- list(NULL)
в качестве решения (так как с помощью<- NULL
приведет к ошибке).
A data.frame
является особый типlist
так что было бы не сложно представить, что подходы для удаления предметов изlist
должно быть таким же, как удаление столбцов изdata.frame
, Однако они дают разные результаты, как видно из приведенного ниже примера.
## Make some small data--two data.frames and two lists
cars1 <- cars2 <- head(mtcars)[1:4]
cars3 <- cars4 <- as.list(cars2)
## Demonstration that the `list(NULL)` approach works
cars1[c("mpg", "cyl")] <- list(NULL)
cars1
# disp hp
# Mazda RX4 160 110
# Mazda RX4 Wag 160 110
# Datsun 710 108 93
# Hornet 4 Drive 258 110
# Hornet Sportabout 360 175
# Valiant 225 105
## Demonstration that simply using `NULL` does not work
cars2[c("mpg", "cyl")] <- NULL
# Error in `[<-.data.frame`(`*tmp*`, c("mpg", "cyl"), value = NULL) :
# replacement has 0 items, need 12
Переключиться на применение той же концепции кlist
и сравните разницу в поведении.
## Does not fully drop the items, but sets them to `NULL`
cars3[c("mpg", "cyl")] <- list(NULL)
# $mpg
# NULL
#
# $cyl
# NULL
#
# $disp
# [1] 160 160 108 258 360 225
#
# $hp
# [1] 110 110 93 110 175 105
## *Does* drop the `list` items while this would
## have produced an error with a `data.frame`
cars4[c("mpg", "cyl")] <- NULL
# $disp
# [1] 160 160 108 258 360 225
#
# $hp
# [1] 110 110 93 110 175 105
Основные вопросы, которые у меня есть, еслиdata.frame
этоlist
почему он ведет себя так по-другому в этом сценарии? Существует ли надежный способ узнать, когда элемент будет отброшен, когда он выдаст ошибку, и когда ему просто дадутNULL
стоимость? Или мы зависим от проб и ошибок для этого?