将多个变量重塑为长格式(窄格式)

时间:2016-10-19 19:07:06

标签: r reshape reshape2

我已经看到一些只使用两个变量来做这个的例子,但是我无法弄清楚如何使用它来处理我的三个变量(或者如果它可以)。我有3个变量,每个变量有2-3个数据点 - 它相当于一个3x3x2的受试者内部ANOVA。

Here are a few lines of my data in wide form.
变量标题表示上下文,熵和分心的程度。

我一直在研究重塑的许多例子,以及融化和colsplit,但无法找出适用于我的数据的解决方案。我知道如果我只有三个级别(或三个时间点)的变量Context,我可以让它工作,但是有三个不同的变量都有不同的级别可能吗?

1 个答案:

答案 0 :(得分: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)

这部分是将Group列分为三个变量,Context,Entropy和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函数删除了Group变量。

我希望这就是你想要的!

相关问题