сложная реструктуризация данных - от широкой к длинной (несколько столбцов) - PullRequest
0 голосов
/ 08 декабря 2018

Я хочу провести реструктуризацию, как описано выше, и я пытаюсь использовать просто gather(), так как нужно создать несколько столбцов ... Кто-нибудь знает способ сделать это?

enter image description here

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Вот опция с reshape.

names(df1)[ncol(df1)] <- "ses1"
df1$ses2 <- df1$ses1 # according to your desired output
out <- reshape(df1, varying = 2:7, direction = "long", sep = "")
out[order(out$id), ]
#    id time mathT write ses
#1.1  1    1    10     2   3
#1.2  1    2    11     3   3
#2.1  2    1     9     3   4
#2.2  2    2     6     5   4
#3.1  3    1     7     1   5
#3.2  3    2     8     1   5

Не то, чтобы нам нужно было создать столбец ses2, чтобы получить желаемый результат.Если вы хотите вместо NA s указать значения ses2 - что я считаю правильным, учитывая вводимые вами данные - взгляните на решение data.table ниже.


Использование melt из data.table

library(data.table)
setDT(df1)
melt(df1,
     id.vars = "id", 
     measure.vars = patterns("^mathT", "^write", "^ses"), 
     variable.name = "Time", 
     value.name = c("mathT", "write", "ses"))
#   id Time mathT write ses
#1:  1    1    10     2   3
#2:  2    1     9     3   4
#3:  3    1     7     1   5
#4:  1    2    11     3  NA
#5:  2    2     6     5  NA
#6:  3    2     8     1  NA

data Благодаря @Pete!

df1 <- data.frame(
  id = c(1, 2, 3),
  mathT1 = c(10, 9, 7),
  mathT2 = c(11, 6, 8),
  write1 = c(2, 3, 1),
  write2 = c(3, 5, 1),
  ses = c(3, 4, 5)
)
0 голосов
/ 08 декабря 2018

Это должно работать, хотя и не самое элегантное:

library(reshape2)
library(tidyr)
library(dplyr)

Пример данных (на основе снимка экрана):

df <- tibble(id = c(1,2,3), 
         mathT1 = c(10, 9, 7),
         mathT2 = c(11, 6, 8),
         write1 = c(2, 3, 1),
         write2 = c(3, 5, 1),
         ses = c(3, 4, 5))

код с использованием пакетов reshape2, dplyr и tidyr:

df <- df %>%
  rename(math_1 = mathT1, math_2 = mathT2, 
         write_1 = write1, write_2 = write2, ses_1 = ses) %>%
  mutate(ses_2 = ses_1) %>%
  melt(id.vars = "id", variable.name = "var", value.name = "value") %>%
  separate(var, c("var", "time"), "_", extra = "merge") %>%
  spread(var, value)
...