подмножество данных в R с использованием единственного [] и без запятой - PullRequest
1 голос
/ 10 марта 2020

относится к предыдущему вопросу mine о написании функций, мне было интересно узнать о подмножестве в R. В каком случае будет использоваться нечто подобное? Возможно ли, что data_filtered хранится в списке?

data_filtered = data_full[id == FP438274 & start == 2019-19-9]

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

Фреймы данных - это списки.

> class(iris)
[1] "data.frame"
> is.list(iris)
[1] TRUE
> is.data.frame(iris)
[1] TRUE

Фреймы данных - это особый тип списка с дополнительными ограничениями (например, каждый элемент списка или столбец, должен иметь одинаковую длину.)

Если вы используете [ с одной запятой, то вы поднаборываете фрейм данных, как если бы это был просто список - то есть вы поднастраиваете столбцы и игнорируете строки data[x] эквивалентно data[, x].

Предполагая, что id и start являются векторами той же длины, что и число столбцов в вашем фрейме данных, тогда data[id == FP438274 & start == 2019-19-9] должно работать хорошо Если, как и в вашем последнем вопросе, id и start имеют ту же длину, что и количество строк в вашем фрейме данных, то data[id == FP438274 & start == 2019-19-9] - нонсенс.

(Также обратите внимание, что вы почти наверняка хотите "2019-19-9" или as.Date("2019-19-9"), как написано 2019-19-9 = 2000 - 9 = 1991, но я не думаю, что вы хотите вычитать.)

0 голосов
/ 10 марта 2020

Я могу ошибаться, но я думаю, что нет или это будет выбор (для переменных - столбцов), в отличие от подмножество (для отдельных лиц - строк). Например, используя первые 6 строк набора данных mtcars, вы можете преобразовать набор данных в список и сделать выборку на основе индекса переменных:

# dataset format
li1 <- head(mtcars)
rownames(li1) <- NULL
str( li1[1:2] ) # ok
#> 'data.frame':    6 obs. of  2 variables:
#>  $ mpg: num  21 21 22.8 21.4 18.7 18.1
#>  $ cyl: num  6 6 4 6 8 6

# list format
li <- as.list(head(mtcars))
str( li[1:2] ) # ok
#> List of 2
#>  $ mpg: num [1:6] 21 21 22.8 21.4 18.7 18.1
#>  $ cyl: num [1:6] 6 6 4 6 8 6

Все становится ужасно, когда вы пытаетесь смешать подмножество и выбор :

# dataset format
str( li1[ li$mpg < 21 ] ) # ?
#> 'data.frame':    6 obs. of  3 variables:
#>  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76
#>  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
#>  $ carb: num  4 4 1 1 2 1

# list format
str( li[ li$mpg < 21 ] )
#> List of 3
#>  $ drat: num [1:6] 3.9 3.9 3.85 3.08 3.15 2.76
#>  $ wt  : num [1:6] 2.62 2.88 2.32 3.21 3.44 ...
#>  $ carb: num [1:6] 4 4 1 1 2 1

Я пока не могу объяснить результат li[ li$mpg < 21 ], если кто-то увидит и захочет помочь здесь, я был бы рад.

РЕДАКТИРОВАТЬ Motus Я понял, что это не твой код, который нужно чистить. Я думаю, что лучше попытаться понять, что предназначалось для написания правильного / более надежного кода R, используя обычный оператор [ с запятой , если есть несколько измерений или формат dplyr::slice() / dplyr::filter.

...