Функция сбора теряет первый столбец в исходном кадре данных - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь привести в порядок кадр данных с gather, но в процессе теряю информацию. Возьмите следующий фрейм данных:

df <- data.frame(user = letters[1:10], score_1 = sample(1:20, 10), score_2 = sample(1:20, 10))

> head(df)
  user score_1 score_2
1    a       5       7
2    b      15       2
3    c      18      15
4    d       1      20
5    e      17      12
6    f       8      19

Отсюда мне нужно сохранить личность пользователя (первый столбец), превратить имена столбцов score_1 и score_2 в ключи в новом столбце «ключ» и преобразовать все значения столбцов 2 и 3 в значения моего нового столбца «значение». Вот что я пробовал:

gather(df, key = "user", value = "score", c(2,3))

      user score
1  score_1     5
2  score_1    15
3  score_1    18
4  score_1     1
5  score_1    17
6  score_1     8
7  score_1     2
8  score_1    20
9  score_1     9
10 score_1     3
11 score_2     7
12 score_2     2
13 score_2    15
14 score_2    20
15 score_2    12
16 score_2    19
17 score_2     8
18 score_2    13
19 score_2     4
20 score_2    18

Этот вывод не является удовлетворительным, поскольку он теряет столбец user в исходном кадре данных. Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 27 марта 2020

Примечание из руководства ?gather

Разработка для gather() завершена, и для нового кода мы рекомендуем переключиться на pivot_longer(), что проще в использовании, более функционально и все еще находится в активной разработке

Вот решение

library(tidyr)
df %>% 
   pivot_longer(starts_with("score"), names_to = "score")

# # A tibble: 20 x 3
#    user  score   value
#    <fct> <chr>   <int>
#  1 a     score_1    10
#  2 a     score_2    19
#  3 b     score_1    13
#  4 b     score_2    18
#  5 c     score_1    11
#  6 c     score_2     8
#  7 d     score_1    15
#  8 d     score_2    13
#  9 e     score_1    14
# 10 e     score_2     3
# 11 f     score_1     8
# 12 f     score_2     5
# 13 g     score_1     2
# 14 g     score_2    12
# 15 h     score_1    17
# 16 h     score_2    10
# 17 i     score_1     3
# 18 i     score_2     1
# 19 j     score_1     1
# 20 j     score_2    16
2 голосов
/ 27 марта 2020

Причина в том, что ключ был указан как пользователь. Здесь key в основном именует созданный столбец с именами столбцов в «длинном» формате. Если мы укажем его как «пользователь» (который уже является столбцом в наборе данных), он обновится, удалив существующий столбец

library(tidyr)
gather(df, key = "user1", value = "score", -user)
1 голос
/ 27 марта 2020

Кажется, ваша проблема использует имя переменной в качестве ключа. Попробуйте

gather(df, key = "usr", value = "score", score_1, score_2)
...