繁体   English   中英

如何重塑数据框?

[英]How can I reshape my dataframe?

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

    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”,“ ansbin1.1”和“ ansbin2.1”。 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",           

但是我每次都会遇到一些问题和警告。 我认为这应该是与列名关联的问题。

你能帮助我吗? 先感谢您! :)

这是我要采取的方法:

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. 从“试验”到第二组“ ansbin”的列彼此堆叠。 我已经用rbindlist(split.default(...))部分做到了这rbindlist(split.default(...))
  2. 将每个生成的“ stim”和“ ansbin”列对彼此堆叠在一起。 我已经用我的答案的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM