Изменить структуру данных таким образом, чтобы каждая запись столбца повторялась над всеми остальными столбцами. - PullRequest
1 голос
/ 16 апреля 2019

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

dat = data.frame(x = c(1, 1.1, 1.2, 1.3), y = c(2, 2.1, 2.2, 2.3), output = c(2, 10, 101, 100))
    x   y output
1 1.0 2.0      2
2 1.1 2.1     10
3 1.2 2.2    101
4 1.3 2.3    100

Я хочу, чтобы каждая пара элементов столбцов "x" и "output" повторялась над столбцом "y".".

Я пытался использовать tidyr::spread, tidyr::gather и reshape2::melt безрезультатно.Это потому, что я новичок в использовании tidyr и reshape2 и других пакетов, изменяющих форму.

В настоящее время я прибег к использованию цикла для извлечения каждой пары элементов из столбцов "x" и "output" и создания нового data.frame, final_df, который объединяет результирующие data.frames.Я считаю, что это определенно не самый эффективный способ сделать это, и я уверен, что где-то есть функция с одной линией, которая может сделать эту магию для меня.

В результирующем data.frame, если я подставлюИспользование data.frame, скажем,

dplyr::filter(final_df, x == 1, output == 2)

должно выглядеть так:

data.frame(x = rep(1, dat$x[1], nrow(dat)), y = dat$y, output = rep(dat$output[1], nrow(dat)))
  x   y output
1 1 2.0      2
2 1 2.1      2
3 1 2.2      2
4 1 2.3      2

Я буду рад ответу с использованием tidyverse.Спасибо.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Одно решение:

require(dplyr)
require(tidyr)
 dat %>% select(-y) %>% crossing(dat %>% select(y))
     x output   y
1  1.0      2 2.0
2  1.0      2 2.1
3  1.0      2 2.2
4  1.0      2 2.3
5  1.1     10 2.0
6  1.1     10 2.1
7  1.1     10 2.2
8  1.1     10 2.3
9  1.2    101 2.0
10 1.2    101 2.1
11 1.2    101 2.2
12 1.2    101 2.3
13 1.3    100 2.0
14 1.3    100 2.1
15 1.3    100 2.2
16 1.3    100 2.3
1 голос
/ 16 апреля 2019

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

library(dplyr)
library(tidyr)
dat %>% mutate(y1=paste(y,collapse = ',')) %>% separate_rows(y1)

Если в выходных данных x и нет дублирования , т.е. мы можем рассматривать их как столбец ID , тогда мы можем использовать tidyr::complete

dat %>% complete(nesting(x,output),y)
...