2016-10-19 1 views
1

Я видел несколько примеров, которые делают это только с двумя переменными, но я не могу понять, как заставить его работать с моими тремя переменными (или если это возможно). У меня есть 3 переменные с 2-3 точками данных каждый - это составляет 3x3x2 внутри объекта ANOVA.Перестановка нескольких переменных в длинную форму (узкая форма)

Here are a few lines of my data in wide form.
Переменные заголовки указывают уровень контекста, энтропии и дистрактора.

Я искал множество примеров изменения формы, а также расплава и colsplit, но не могу определить решение, которое будет работать для моих данных. Я знаю, что если бы у меня была переменная Context с тремя уровнями (или тремя временными точками), я мог бы заставить ее работать, но с тремя разными переменными все с разными уровнями это возможно?

+1

Не публикуйте свои данные в качестве изображения, пожалуйста, узнайте, как дать [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610) – Jaap

+0

'library (data.table); ? melt.data.table' или 'library (tidyr); ? Gather'. –

ответ

0

Это может быть не самый эффективный способ, но он работает.

library(reshape2) 
library(dplyr) 
# create example dataset 
my_df = data.frame(Subj_No = 314:318, 
        Context1_Entropy1_Dist1 = rep(1, 5), 
        Context1_Entropy2_Dist1 = rep(2, 5), 
        Context1_Entropy1_Dist2 = rep(3, 5), 
        Context1_Entropy2_Dist2 = rep(4, 5), 
        Context2_Entropy1_Dist1 = rep(5, 5), 
        Context2_Entropy2_Dist1 = rep(6, 5), 
        Context2_Entropy1_Dist2 = rep(7, 5), 
        Context2_Entropy2_Dist2 = rep(8, 5), 
        Context3_Entropy3_Dist2 = rep(9, 5), 
        Context3_Entropy3_Dist1 = rep(10, 5)) 

# melt data from wide to long form 
my_df = melt(my_df, id.vars = "Subj_No", variable.name = "Group", 
      value.name = "Value") 

# convert Group column to character 
my_df$Group = as.character(my_df$Group) 

# split group into three separate groups 
groups = strsplit(my_df$Group, "_") %>% 
    unlist() %>% 
    matrix(ncol = 3, byrow = TRUE) %>% 
    data.frame(stringsAsFactors = TRUE) 

Эта часть, чтобы разделить группы столбцов в трех переменные, контекст, энтропию и Dist с разделителем «_», unlist, хранить в качестве матрицы по строке, и конвертировать в data.frame.

# some further processing 
names(groups) = c("Context", "Entropy", "Dist") 
levels(groups$Context) = 1:3 
levels(groups$Entropy) = 1:3 
levels(groups$Dist) = 1:2 

Releveling не является обязательным, но я подумал, что это может быть проще для вас ссылки на группы по ряду вместо чего-то вроде «context1», или «Entropy2».

# Combine the new groups with original df and drop Groups col 
my_df = cbind(my_df, groups) %>% mutate(Group = NULL) 

Последняя функция mutate оставляет переменную группы.

Надеюсь, это то, что вы хотите!

Смежные вопросы