Как я могу изменить мою структуру данных?

У меня есть огромный фрейм данных, который в простой версии выглядит так:

    trials=c("1","2","3","4","5","6","7","8","9","10")
    co =c(rep ("1",10))
    stim=c("8","9","11","2","4","7","8","1","12","16")
    ansbin=c("1","0","1","0","0","1","0","1","1","0")
    stim.1=c("11","2","11","7","4","3","9","1","4","16")
    ansbin.1=c("0","0","1","0","0","1","0","1","1","1")
    trials.1=c("1","2","3","4","5","6","7","8","9","10")
    co.1 =c(rep ("2",10))
    stim1.1=c("11","2","11","2","5","7","8","15","17","10")
    ansbin1.1=c("1","1","1","0","0","1","1","1","0","1")
    stim2.1=c("11","2","14","1","4","8","9","10","4","12")
    ansbin2.1=c("0","1","1","0","0","1","0","0","1","0")
    ID<-     data.frame(trials,co,stim,ansbin,stim.1,ansbin.1,trials.1,co.1,stim1.1,ansbin1.1,stim2.1,ansbin2.1)

    View(ID)

Теперь я хотел бы сформировать мой новый data.frame таким образом, чтобы "стим", "стим.1", "стим1.1" и "стим2.1" находились в одном столбце под названием "стимул", и то же самое для ответов: я хотел бы, чтобы все "ansbin", "ansbin.1", "ansbin1.1" и "ansbin2.1" в одном столбце назывались "answers". Trials и Trials.1 одновременно должны находиться под одним столбцом, но разница будет в столбце "co".

Я попытался использовать "изменить", как это:

     df<-reshape(ID, direction="long",
           idvar=c("trials", "co"),
           varying= c("stim","stim.1",    "stim1.1","stim2.1","ansbin","ansbin.1","ansbin1.1","ansbin2.1"
           v.names=c("stimulus","answer"),
           timevar="num",           

)

но у меня всегда есть проблемы и предупреждения. Я думаю, что это должно быть проблемой, связанной с именем столбцов.

Вы можете мне помочь? Заранее спасибо!:)

2 ответа

Вот подход, который я бы выбрал:

library(data.table)
melt(
  rbindlist(split.default(ID, cumsum(grepl("^trials", names(ID))))), 
  measure.vars = patterns("^stim", "^ansbin"), value.name = c("stim", "ansbin"))
#     trials co variable stim ansbin
#  1:      1  1        1    8      1
#  2:      2  1        1    9      0
#  3:      3  1        1   11      1
#  4:      4  1        1    2      0
#  5:      5  1        1    4      0
# ---                               
# 36:      6  2        2    8      1
# 37:      7  2        2    9      0
# 38:      8  2        2   10      0
# 39:      9  2        2    4      1
# 40:     10  2        2   12      0

По сути, это звучит так, будто вы смотрите на два раунда "изменения формы".

  1. Укладка столбцов от "испытаний" до второго набора "ансбина" друг на друга. Я сделал это с rbindlist(split.default(...)) часть моего ответа.
  2. Укладывая каждую полученную пару столбцов "стим" и "ансбин" друг на друга. Я сделал это с melt(...) часть моего ответа.

Подумайте о создании списка измененных фреймов данных для каждого набора: co, испытания, стимулы и ответы, а затем объедините их вместе. Однако, поскольку co и испытания переносят только два столбца, в то время как последние два переносят четыре столбца, рассмотрите повторяющиеся столбцы перед изменением формы:

ID$co2 <- ID$co
ID$co3 <- ID$co.1

ID$trials.2 <- ID$trials
ID$trials.3 <- ID$trials.1

df_list <- lapply(c("co", "trials", "stim", "ans"), function(s)      
  reshape(ID, direction="long",
          varying= grep(s, names(ID)),
          v.names=c(s),
          drop = grep(paste0("^", s), names(ID), invert=TRUE),
          timevar="num",
          new.row.names = 1:1000)      
)

# CHAIN MERGE
finaldf <- Reduce(function(x, y) merge(x, y,  by=c('id', 'num')), df_list)
finaldf <- with(finaldf, finaldf[order(num, id),])    # SORT DATAFRAME
rownames(finaldf) <- NULL                             # RESET ROWNAMES 

head(finaldf)
#   id num co trials stim ans
# 1  1   1  1      1    8   1
# 2  2   1  1      2    9   0
# 3  3   1  1      3   11   1
# 4  4   1  1      4    2   0
# 5  5   1  1      5    4   0
# 6  6   1  1      6    7   1
Другие вопросы по тегам