Порядок ключей в сравнении с порядком исходных столбцов с помощью функции collect()

Зависит ли порядок ключей от того, перечисляю ли я сначала столбцы для сбора по сравнению с теми, которые не собираем?

Это мой data.frame:

library(tidyr)
wide_df <- data.frame(c("a", "b"), c("oh", "ah"), c("bla", "ble"), stringsAsFactors = FALSE)
colnames(wide_df) <- c("first", "second", "third")
wide_df

 first second third
1     a     oh   bla
2     b     ah   ble

Сначала я собираю все столбцы в определенном порядке, и мой порядок учитывается в списке ключей как второй, первый, хотя на самом деле столбцы упорядочены как первый, второй:

long_01_df <- gather(wide_df, my_key, my_value, second, first, third)
long_01_df

  my_key my_value
1 second       oh
2 second       ah
3  first        a
4  first        b
5  third      bla
6  third      ble

Затем я решаю исключить из сбора одну колонку:

long_02_df <- gather(wide_df, my_key, my_value, second, first, -third)
long_02_df

 third my_key my_value
1   bla second       oh
2   ble second       ah
3   bla  first        a
4   ble  first        b

Ключи снова упорядочены как второй, первый. Затем я кодирую это так, полагая, что делаю то же самое:

long_03_df <- gather(wide_df, my_key, my_value, -third, second, first)
long_03_df

И я получаю ключи, упорядоченные в соответствии с реальным порядком столбцов в исходном data.frame:

 third my_key my_value
1   bla  first        a
2   ble  first        b
3   bla second       oh
4   ble second       ah

Это поведение даже не меняется, когда я вызываю функцию с factor_key = TRUE. Что мне не хватает?


person Silvie    schedule 13.04.2016    source источник
comment
Интересно. Кажется, что исключения должны быть хвостом. Применяется также к dplyr::select(iris[, 1:3], -Sepal.Length, Petal.Length, Sepal.Width).   -  person lukeA    schedule 13.04.2016


Ответы (1)


Резюме

Причина этого в том, что нельзя смешивать отрицательные и положительные индексы. (Вы также не должны: это просто не имеет смысла.) Если вы сделаете это, gather() проигнорирует некоторые индексы.

Подробный ответ

Также для стандартной индексации нельзя смешивать положительные и отрицательные индексы:

x <- 1:10
x[c(4, -2)]
## Error in x[c(4, -2)] : only 0's may be mixed with negative subscripts

Имеет смысл, что это так: индексирование с помощью 4 говорит R сохранить только четвертый элемент. Нет необходимости указывать ему явно, чтобы дополнительно отбрасывать второй элемент.

Согласно документации gather(), выбор столбцов работает так же, как и в select() dplyr. Итак, давайте поиграем с этим. Я буду работать с подмножеством mtcars:

mtcars <- mtcars[1:2, 1:5]
mtcars
##                mpg cyl disp  hp drat
## Mazda RX4     21.0   6  160 110 3.90
## Mazda RX4 Wag 21.0   6  160 110 3.90

Вы можете использовать положительное и отрицательное индексирование с помощью select():

select(mtcars, mpg, cyl)
##              mpg cyl
## Mazda RX4      21   6
## Mazda RX4 Wag  21   6

select(mtcars, -mpg, -cyl)
##               disp  hp drat
## Mazda RX4      160 110  3.9
## Mazda RX4 Wag  160 110  3.9

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

select(mtcars, mpg, -hp, cyl)
##               mpg cyl
## Mazda RX4      21   6
## Mazda RX4 Wag  21   6

select(mtcars, -mpg, hp, -cyl)
##               disp  hp drat
## Mazda RX4      160 110  3.9
## Mazda RX4 Wag  160 110  3.9

Как видите, результаты точно такие же, как и раньше.

Для ваших примеров с gather() вы используете эти две строки:

long_02_df <- gather(wide_df, my_key, my_value, second, first, -third)
long_03_df <- gather(wide_df, my_key, my_value, -third, second, first)

Согласно тому, что я показал выше, эти строки идентичны:

long_02_df <- gather(wide_df, my_key, my_value, second, first)
long_03_df <- gather(wide_df, my_key, my_value, -third)

Обратите внимание, что во второй строке нет ничего, что указывало бы на предпочтительный порядок ключей. Это только говорит о том, что third следует опустить.

person Stibu    schedule 13.04.2016