Как я могу переходить от широкой к длинной, соединяя пронумерованные столбцы друг с другом? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть набор данных, который выглядит следующим образом:

phrase      wo1sp     wo2sp     wo3sp     wo1sc     wo2sc     wo3sc
hello       dan       mark      todd      10        5         4
hello       mark      dan       chris     8         9         4
goodbye     mark      dan       kev       2         4         10
what        kev       dan       mark      4         5         5

И я хотел бы изменить его на что-то вроде этого:

phrase      sp      sc
hello       dan     10 
hello       mark    5
hello       todd    4
hello       mark    8
hello       dan     9
hello       chris   4
goodbye     mark    2
goodbye     dan     4
goodbye     kev     10
what        kev     4
what        dan     5
what        mark    5

Итак, я знаю первоесделать здесь group_by(phrase).В чем я не уверен, так это в том, как связать sp1 с sc1, sp2 с sc2 и т. Д. И сделать так, чтобы каждый из них был в своих рядах.Я видел некоторые смутно похожие вещи, использующие reshape и tidy, но они не зависят от наличия связанных столбцов.Я бы просто хотел свернуть числа в именах столбцов.

У меня есть запрос: когда вы ответите, не могли бы вы объяснить, что делает сам код?Многие вещи, которые я искал в StackExchange, представляют собой, казалось бы, эзотерическое решение без объяснения того, что происходит.

1 Ответ

0 голосов
/ 19 декабря 2018
library("tidyverse")

test_set = tribble(~phrase,      ~wo1sp,     ~wo2sp,     ~wo3sp,     ~wo1sc,     ~wo2sc,     ~wo3sc,
                   "hello",       "dan",       "mark",      "todd",      10,        5,         4,
                   "goodbye",     "mark",      "dan",       "kev",       2,         4,         10,
                   "what",        "kev",       "dan",       "mark",      4,         5,         5)

test_set %>% 
  gather(key = col, value = val, -phrase) %>% 
  separate(col = col, into = c("num", "suffix"), sep = 3) %>% 
  spread(key = suffix, value = val) %>% 
  mutate(sc = as.numeric(sc)) %>% 
  select(-num)

Редактировать: я думаю, что нет необходимости разбивать col на три столбца, можно просто сделать sep = 3

...