Неожиданное поведение: удаление строк из фрейма данных преобразуется в вектор R - PullRequest
2 голосов
/ 08 апреля 2020

Я вижу то, что кажется странным в R: когда я удаляю строки из простого фрейма данных, объект преобразуется в вектор. Ожидается ли это?

Пример:

a = data.frame(x = 1:10) #create simple dataframe
> a
    x
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10

> class(a) #check its a dataframe
[1] "data.frame"

a <- a[-(1:2), ] #remove the first two rows from the dataframe

> a #check the rows are gone (but note result prints as a vector)
[1]  3  4  5  6  7  8  9 10

> class(a) #check the class to see that it is actually a vector
[1] "integer"

as.data.frame(a) #convert back to dataframe, and find that the name of the col is changed. 
   a
1  3
2  4
3  5
4  6
5  7
6  8
7  9
8 10

Потеря colname является проблемой, когда я применяю dplyr, где я полностью теряю имя:

data.frame(x = 1:10) %>%
  .[-(1:2), ] %>%
  as.data.frame()
   .
1  3
2  4
3  5
4  6
5  7
6  8
7  9
8 10

Я бы ожидал:

   x
1  3
2  4
3  5
4  6
5  7
6  8
7  9
8 10

Ожидается ли это? Если да, то почему и как я могу удалить строки из простого кадра данных без потери имен столбцов?

1 Ответ

2 голосов
/ 08 апреля 2020

Мы можем использовать drop по умолчанию для ?Extract

x [i, j, ..., drop = TRUE]

и документация drop гласит:

drop - для матриц и массивов. Если TRUE, результат приводится к минимально возможному измерению (см. Примеры). Это работает только для извлечения элементов, а не для замены. Смотрите подробности в разделе drop.

drop ИСТИНА, особенно с data.frame. Но это не относится к subset или data.table или tibble

a[-(1:2),, drop = FALSE] 
#    x
#3   3
#4   4
#5   5
#6   6
#7   7
#8   8
#9   9
#10 10

Это тот случай, когда есть один столбец или строка


При tibble размеры не упадут

library(dplyr)
tibble(x = 1:10) %>% 
   slice(-(1:2))
# A tibble: 8 x 1
#      x
#  <int>
#1     3
#2     4
#3     5
#4     6
#5     7
#6     8
#7     9
#8    10

или

tibble(x = 1:10)[-(1:2),]

или data.table

library(data.table)
data.table(x = 1:10)[-(1:2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...