Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何重塑数据帧?_R_Dataframe_Reshape - Fatal编程技术网

R 如何重塑数据帧?

R 如何重塑数据帧?,r,dataframe,reshape,R,Dataframe,Reshape,我有一个巨大的数据框,在一个简单的版本中,它看起来像这样: 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","

我有一个巨大的数据框,在一个简单的版本中,它看起来像这样:

    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)
现在,我想以stim、stim.1、stim1.1和stim2.1位于同一个名为“刺激”的列下的方式来构建我的新data.frame,答案也是这样:我希望所有的ansbin、ansbin.1、ansbin 1.1和ansbin 2.1位于同一个名为“答案”的列下。 试验和试验。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",           

但我每次都有一些问题和警告。我认为这应该是一个与栏目名称相关的问题

你能帮我吗?
提前谢谢你!:

以下是我将采取的方法:

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
基本上,这听起来像是两次整形

将试验中的立柱堆叠到第二组ansbin上。我已经用rbindlistsplit完成了。默认。。。我的部分答案。 将生成的每对stim和ansbin列堆叠在彼此的顶部。我已经用融化的水做了。。。我的部分答案。
考虑为每个集合建立一个重塑的数据帧列表: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