Это может быть не самый эффективный способ, но он работает.
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
оставляет переменную группы.
Надеюсь, это то, что вы хотите!
Не публикуйте свои данные в качестве изображения, пожалуйста, узнайте, как дать [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610) – Jaap
'library (data.table); ? melt.data.table' или 'library (tidyr); ? Gather'. –