is.list всегда возвращает true в столбцах tibble? - PullRequest
1 голос
/ 22 апреля 2020

Итак, у меня есть таблица, содержащая как векторные, так и списочные столбцы.

С помощью dplyr легко выбрать список-столбцы:

select_if(tb, is.list)

, но его отрицание с помощью ! или - не работает * Редактирование 1008 *, это select_if(tb,function(x)!is.list(x))

Поэтому я подумал, что мог бы сделать что-то вроде:

select(tb, which(!apply(tb,2,is.list))

Это возвращает без столбцов . Поскольку, по-видимому (здесь и представлено представление), is.list для столбцов таблицы всегда возвращает true, даже для векторных столбцов (?).

df <- data.frame(A = runif(100))
tb <- tibble(A = runif(100))

is.list(df$A)
# FALSE
is.list(tb$A)
# FALSE
is.list(df[,1])
# FALSE
is.list(tb[,1])
# TRUE

Кто-нибудь может пролить свет на то, что здесь происходит?

1 Ответ

1 голос
/ 22 апреля 2020

Поскольку в tibble задан аргумент сброса по умолчанию, равный FALSE, то есть, когда вы поднастраиваете только один столбец из фрейма данных, он возвращает вектор чисел c, тогда как при задании поднабора одного столбца из тиббла возвращается тиббл из одного столбца.

Проверьте свои занятия.

class(df[, 1])
#[1] "numeric"
class(tb[, 1])
#[1] "tbl_df"     "tbl"        "data.frame"

Если вы добавите drop = FALSE в фрейм данных, он вернет вам фрейм данных.

class(df[, 1, drop = FALSE])
#[1] "data.frame"

Столбец данных / таблица все еще является списком.

is.list(tb[, 1])
#[1] TRUE
is.list(df[, 1, drop = FALSE])
#[1] TRUE

Итак, чтобы ответить на ваш вопрос, да, is.list всегда возвращает TRUE в таблице, если вы явно не упомянули drop = TRUE в таблице из одной колонки.

is.list(tb[, 1, drop = TRUE])
#[1] FALSE
...