Обратный спред с использованием сбора - PullRequest
1 голос
/ 18 апреля 2019

У нас есть рейтинговая матрица:

df <- data.frame(Customer.ID=c("c1",'c1','c1','c2','c2','c3'),
             Movie.ID=c("m1", "m3", "m5", "m1", "m5", "m7"),
             Rating=c(1,2,1,3,3,1))
df
  Customer.ID Movie.ID Rating
1          c1       m1      1
2          c1       m3      2
3          c1       m5      1
4          c2       m1      3
5          c2       m5      3
6          c3       m7      1

Когда я выкладываю и меняю названия строк следующим образом:

df1 <- df %>% spread(key = 'Movie.ID', value = 'Rating')
df1 <- data.frame(df1, row.names = 'Customer.ID')

Я получаю:

> df1
   m1 m3 m5 m7
c1  1  2  1 NA
c2  3 NA  3 NA
c3 NA NA NA  1

Iхочу, чтобы df1 снова выглядел df.

Я пытался:

df2 <-setDT(df1, keep.rownames = TRUE)[]
df2 <- gather(df2, Video.ID, Rating, 2:4)

Но он возвращает меня:

> df2
  rn m7 Video.ID Rating
1 c1 NA       m1      1
2 c2 NA       m1      3
3 c3  1       m1     NA
4 c1 NA       m3      2
5 c2 NA       m3     NA
6 c3  1       m3     NA
7 c1 NA       m5      1
8 c2 NA       m5      3
9 c3  1       m5     NA

1 Ответ

0 голосов
/ 18 апреля 2019

Хотя я не уверен, почему вы делаете это (см. Комментарий @Jack Brookes), вы можете сделать это довольно легко с помощью dplyr функций:

df1 %>% 
  rownames_to_column('Customer.ID') %>% 
  gather(m1:m7, key = 'Movie.ID', value = 'Rating') %>% 
  filter(!is.na(Rating))

, что дает нам:

  Customer.ID Movie.ID Rating
1          c1       m1      1
2          c2       m1      3
3          c1       m3      2
4          c1       m5      1
5          c2       m5      3
6          c3       m7      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...