Как вы pivot_wider, где значения являются символами? - PullRequest
1 голос
/ 07 января 2020

Я хочу использовать pivot_wider или распространение, где значения являются символьными строками.

Вот пример:

a <- c("a", "a", "b", "c", "c", "c")
x <- c("x", "y", "y", "x", "y", "z")
m <- cbind(a,x)
> m
  a   x  
[1,] "a" "x"
[2,] "a" "y"
[3,] "b" "y"
[4,] "c" "x"
[5,] "c" "y"
[6,] "c" "z"

Требуемый вывод:

      V1 V2   V3   V4
one    a  x    y <NA>
two    b  y <NA> <NA>
three  c  x    y    z

Однако мой старый go to, распространять, не работает:

> as.data.frame(m) %>% spread(key = a, value = x)
Error: Each row of output must be identified by a unique combination of keys.
Keys are shared for 5 rows:
* 1, 2
* 4, 5, 6

и pivot_wider:

 as.data.frame(m) %>%
  group_by(a) %>%
  mutate(namer = n()) %>%
  ungroup() %>%
  pivot_wider(#id_cols = a,
              names_from = namer,
              values_from = x,
              values_fill = list(namer = "none"),
              names_prefix = "City")

Есть предложения?

@ akrun спасибо за ответ, там происходит довольно много, вот что я сузил до:

m <- data.frame(a, x) 
m %>% group_by(a) %>% 
   mutate(rn = str_c("V", row_number()+1)) %>% 
   ungroup %>% 
   pivot_wider(names_from = rn, values_from = x) 

работает. Но

m %>% 
   group_by(a) %>% 
   mutate(rn = n()) %>% 
   ungroup %>% 
   pivot_wider(names_from = rn, values_from = x, names_prefix = "V") 

нет. Похоже, проблема заключалась в том, что я использовал числа в качестве имен и преобразовывал их в символы с помощью names_prefix. Это тоже ваше понимание?

1 Ответ

2 голосов
/ 07 января 2020

Мы можем создать data.frame вместо matrix (cbind создает matrix)

library(dplyr)
library(tidyr)
library(stringr)
library(english)
m %>% 
    group_by(a) %>%
    mutate(rn = str_c("V", row_number()+1)) %>% 
    ungroup %>%
    rename(V1 = a) %>%
    pivot_wider(names_from = rn, values_from = x) %>%   
    mutate(rn = as.character(english(row_number()))) %>%
    column_to_rownames('rn')
#      V1 V2   V3   V4
#one    a  x    y <NA>
#two    b  y <NA> <NA>
#three  c  x    y    z

data

m <- data.frame(a, x)
...