Удаление столбцов со скобками в R не работает

#r

Вопрос:

У меня есть фрейм данных:

 ID    user    study    var   varb   varc   varf
101   a       b         3     4      3       4
102   b       a         4     5      5       6
103   g       a         4     4      5       6
104   b       c         6     7      7       5
 

Я пытаюсь удалить первые три столбца, используя позиции индекса

 df <- df[-c(1:3)]
 

Я был уверен, что этот метод работает для удаления столбцов. На самом деле, когда я впервые запустил эту строку, она работала так, как ожидалось, но теперь все, что она делает, — это удаляет строки вместо столбцов. Теперь я просто использую subset() метод удаления столбцов, который отлично работает. Но я хочу освежить свой R, так как я заржавел после того, как так долго не писал в нем. Где я ошибся с оригинальным методом, который использовал раньше?

Комментарии:

1. Что class(df) возвращается? Но df[, -c(1:3)] , вероятно, это сработало бы.

2. Он возвращает два значения: data.table и data.frame

3. Смотрите первый раздел в data.table часто задаваемых вопросах 2.17, Каковы меньшие синтаксические различия между data.frame и data.table

Ответ №1:

Если это a data.table , нам может понадобиться

 df[, -c(1:3), with = FALSE]
 

Или, возможно, использовать select из dplyr

 library(dplyr)
df %>%
    select(-(1:3))
 

Комментарии:

1. Я думаю, что вы правы. class(df) возвращает два класса data.table and data.frame , но я думаю, что он действует как первый. Запуск первого метода делает то, что я хотел. Я думаю, что это был вопрос класса. Я просто выбрал первый метод, который запомнил, и даже не подумал проверить.

2. @AcidCatfish у вас может быть несколько атрибутов для класса, т. е. data.таблица построена поверх data.frame, которая будет обладать некоторыми свойствами data.frame с измененными свойствами из data.table. Это первый класс, то есть выдающийся

3. ,@ akrun: Это сработает? data.frame(df[-c(1:3)])

4. @TarJae, я думаю data.frame , что вызов должен быть as.data.frame(df)[-(1:3)] вызван тем, что ваше подмножество выполняется внутри data.table , а не после преобразования в data.frame

5. От data.table v1.9.8 , вам не нужно использовать with=FALSE