Поворот от широкой к длинной в R - PullRequest
0 голосов
/ 10 апреля 2020

Мне нужно повернуть матрицу в R, и я немного озадачен тем, как именно правильно получить то, что я хочу. Я уверен, что pivot_longer, вероятно, ответ, но я не могу понять это.

Мой текущий фрейм данных выглядит так:

d<-data.frame(c(1,2),c(4,5),c(2,3),c(5,4))
names(d)<-(c("treat1-measure1","treat1-measure2","treat2-measure1","treat2-measure2"))
d

Как вы можете видеть, у нас есть то же самое две меры по двум методам для нескольких независимых прогонов эксперимента.

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

p<-data.frame(c(1,1,2,2),c(1,2,2,3),c(4,5,5,4))
names(p)<-c("treat","m1","m2")
p

В реальных данных есть только 3 меры и две экспериментальные группы, так что небольшая ручная работа выполнима. Спасибо за любую помощь

Ответы [ 2 ]

4 голосов
/ 10 апреля 2020

Ниже приведен подход с tidyr с небольшой подсказкой от tibble:

library(tidyr)
library(tibble)
d %>% rownames_to_column(var = "index") %>%
  pivot_longer(cols = (-index)) %>%
  separate(col = "name", into = c("Treatment","Measure")) %>%
  pivot_wider(id_cols = c("index","Treatment"), names_from = "Measure") %>%
  select(-index)
#  Treatment measure1 measure2
#  <chr>        <dbl>    <dbl>
#1 treat1           1        4
#2 treat2           2        5
#3 treat1           2        5
#4 treat2           3        4

Редактировать: если кто-нибудь когда-нибудь обнаружит это позже, другой подход, не основанный на создании индекса столбец будет с unnest:

d %>%
  pivot_longer(cols = everything()) %>%
  separate(col = "name", into = c("Treatment","Measure")) %>%
  pivot_wider(id_cols = c("Treatment"), names_from = "Measure") %>%
  unnest(cols = c("measure1", "measure2"))
## A tibble: 4 x 3
#  Treatment measure1 measure2
#  <chr>        <dbl>    <dbl>
#1 treat1           1        4
#2 treat1           2        5
#3 treat2           2        5
#4 treat2           3        4

Редактировать 2: Я рекомендую использовать намного лучший метод @ akrun с тонко документированным .value стражем от tidyr.

2 голосов
/ 10 апреля 2020

Мы можем использовать melt с data.table

library(data.table)
melt(setDT(d), measure = patterns('measure1', 'measure2'), 
     value.name = c('m1', 'm2'), variable.name = 'treat')
#   treat m1 m2
#1:     1  1  4
#2:     1  2  5
#3:     2  2  5
#4:     2  3  4

Или с помощью одного pivot_longer с tidyr

library(tidyr)
pivot_longer(d, cols = everything(), 
        names_to = c('group', '.value'), names_sep='-')
# A tibble: 4 x 3
#  group  measure1 measure2
#  <chr>     <dbl>    <dbl>
#1 treat1        1        4
#2 treat2        2        5
#3 treat1        2        5
#4 treat2        3        4
...