В R какая разница между [[X]] и [, X] при выборе векторов - PullRequest
3 голосов
/ 26 апреля 2019
library(tidyverse)
df0 <- data.frame(col1 = c(5, 2), col2 = c(6, 4))
df1 <- data.frame(col1 = c(5, 2), 
                  col2 = c(6, 4),
                  col3 = ifelse(apply(df0[, 1:2], 1, sum) > 10 & 
                                  df0[, 2] > 5, 
                                "True",
                                "False"))
df2 <- as_tibble(df1)

У меня есть мой фрейм данных df1 выше. Я в основном "скопировал" это как tibble df2. Давайте подражаем анализу для этого df1 фрейма данных и df2 tibble.

identical(df1[[2]], df1[, 2])
# [1] TRUE
identical(df2[[2]], df2[, 2])
# [1] FALSE

Поскольку df1 и df2 по сути являются "одинаковыми", почему я получаю дихотомию TRUE / FALSE в моем кодовом блоке выше. Что такое свойство tibble(), которое изменилось?

Тот же вопрос задавался по-другому - в чем разница между [[X]] и [, X] применительно к базе R, а также при использовании в тидиверсе?

1 Ответ

3 голосов
/ 26 апреля 2019

Поскольку все списки являются векторами, мы можем думать об этом с точки зрения подмножества списков.Возьмем для примера:

L <- list(A = c(1, 2), B = c(1, 4))
L[[2]]

Это Extract s второй элемент списка.Экстраполируйте это на:

df1[[2]] 

Мы получаем тот же результат, что и df1[, 2], следовательно, identical(df1[[2]], df1[, 2]) возвращает TRUE.Вторая часть связана со структурой tibble, то есть:

typeof(as_tibble(df1)[[2]])
[1] "double"
typeof(as_tibble(df1[, 2]))
[1] "list"

Вторая - list, а first - вектор, следовательно, identical возвращает FALSE.

Объекты класса tbl_df имеют: (из документов)

Атрибут класса c("tbl_df", "tbl", "data.frame").

Базовый тип «списка»,где каждый элемент списка имеет одинаковый NROW ().

Атрибут имен, который представляет собой вектор символов той же длины, что и базовый список.

Атрибут row.names,включен для совместимости с базовым классом data.frame.Этот атрибут используется только для запроса количества строк, любые имена строк, которые могут там храниться, игнорируются большинством методов tibble.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...