Использование Dplyr для распространения от длинного к широкому;более элегантное решение? - PullRequest
0 голосов
/ 25 апреля 2018

Это пример длинных данных формы, которые у меня есть:

ID   value1     value2
1   4.333333   3.833333
1   4.333333   3.333333
2   4.583333   5.500000
2   3.916667   3.750000
3   4.500000   4.666667
3   4.333333   4.500000

Мне нужно преобразовать его в широкую форму, например:

ID   value1A    value1B   value2A    value2B
1   4.333333   3.833333  4.333333   3.833333 
2   4.333333   3.333333  4.333333   3.833333
3   4.583333   5.500000  4.333333   3.833333

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

ds_spread <- gather(ds,condition, value, contains("value")) %>% 
  separate(condition, into = c("t1", "t2")) %>% 
  arrange(ID) %>% 
  group_by(ID) %>% 
  mutate(rownum = row_number()) %>% 
  select(-t1,-t2) %>% 
  spread(rownum, value)

В итоге я получил результат, который искал. Однако было ли это случайно? Нужно ли собирать%>% отдельный%>% упорядочить%>% mutate%>%? Есть ли более элегантное решение?

1 Ответ

0 голосов
/ 25 апреля 2018

Вот один из вариантов.

library(dplyr)
library(tidyr)

dat2 <- dat %>%
  group_by(ID) %>%
  mutate(Letter = LETTERS[row_number()]) %>%
  ungroup() %>%
  gather(Value, Number, starts_with("value")) %>%
  unite(Col, Value, Letter, sep = "") %>%
  spread(Col, Number) 
dat2
# # A tibble: 3 x 5
#      ID value1A value1B value2A value2B
#   <int>   <dbl>   <dbl>   <dbl>   <dbl>
# 1     1    4.33    4.33    3.83    3.33
# 2     2    4.58    3.92    5.50    3.75
# 3     3    4.50    4.33    4.67    4.50

ДАННЫЕ

dat <- read.table(text = "ID   value1     value2
1   4.333333   3.833333
1   4.333333   3.333333
2   4.583333   5.500000
2   3.916667   3.750000
3   4.500000   4.666667
3   4.333333   4.500000",
                  header = TRUE, stringsAsFactors = FALSE)
...