Ошибка pivot_longer: невозможно объединить разные классы? - PullRequest
2 голосов
/ 28 мая 2020

Допустим, у меня есть этот df:

df <- data.frame(a= "a", b = 1, col3 = "c", col4 = "d") %>% print()

Когда я пытаюсь «удлинить» его с помощью этого кода,

df %>% pivot_longer(1:4, names_to = "test", values_to = "test2")

я получаю следующую ошибку:

Error: Can't combine `a` <factor<127a2>> and `b` <double>.

Почему я получаю это? Поскольку первый столбец и первая строка имеют одно и то же значение, «a» (я безуспешно пробовал аргумент names_repair)? Или потому что a и b - разные классы? Чего я не понимаю, так это того, что я часто сводлю данные разных классов, и это всегда работает. Или это потому, что я пытаюсь повернуть фактический заголовок (это то, что мне действительно нужно сделать)?

Любая помощь очень ценится. Желаемый результат:

#a     a
#b     1 
#col3  c
#col4  d

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Вы получаете это сообщение, потому что a и b являются разными классами, см. Сообщение об ошибке. Определите новый класс столбца явно, используя values_ptypes, этот класс должен быть ниже классов a и b, чтобы к нему можно было привести a и b.

tidyr::pivot_longer(df, 1:4, names_to = "test", values_to = "test2", 
                    values_ptypes = list(test2=character()))

# A tibble: 4 x 2
  test  test2
  <chr> <chr>
1 a     a    
2 b     1    
3 col3  c    
4 col4  d    
1 голос
/ 09 августа 2020

Это может быть более простым в базовом R, где вы можете просто t преобразовать фрейм данных. Поскольку он приводит к матрице, просто преобразуйте обратно as.data.frame.

as.data.frame(t(df))
#      V1
# a     a
# b     1
# col3  c
# col4  d

Используйте unname для получения более чистых имен строк.

as.data.frame(unname(t(df)))
#   V1
# 1  a
# 2  1
# 3  c
# 4  d

Если вы хотите, чтобы имена были дополнительной переменной , сделайте так:

data.frame(V1=names(df), V2=unname(t(df)))
#     V1 V2
# 1    a  a
# 2    b  1
# 3 col3  c
# 4 col4  d
...