簡體   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