gpt4 book ai didi

r - 两级纵向数据 : how to reshape?

转载 作者:行者123 更新时间:2023-12-04 12:22:19 24 4
gpt4 key购买 nike

我有一个数据集,其中包含每个受试者的海马体积的多个时间点。每个海马体积都有左右测量值。我现在想纵向比较左右变化。我知道如何为时间点 reshape 我的数据,但我不知道如何向其中添加“侧面”的级别。

所以这是我的可重复数据集:

mydata <- data.frame(SID=sample(1:150,400, replace=TRUE), hippLeft_T1=sample(6000:8000,400,replace=TRUE), hippRight_T1=sample(6000:8000,400,replace=TRUE),hippLeft_T2=sample(6000:8000,400,replace=TRUE), hippRight_T2=sample(6000:8000,400,replace=TRUE),hippLeft_T3=sample(6000:8000,400,replace=TRUE), hippRight_T3=sample(6000:8000,400,replace=TRUE))

这就是我纵向 reshape 它的方式:
long <- reshape(mydata, direction="long", varying=list(c(2,4,6),c(3,5,7)),idvar="SID", timevar="time", v.names=c("HippLeft","HippRight"), times=c("time1","time2","time3"))

我应该两次应用 reshape 以获得左侧和右侧的级别吗?或者有另一种方法可以做到这一点?谢谢!

**我想得到的是以下内容:
enter image description here

最佳答案

一种方法是使用 unite 的组合。 , gather , 和 separate来自 tidyr :

library(tidyr)
long <- mydata %>% unite("times1", hippLeft_T1,hippRight_T1) %>%
unite("times2", hippLeft_T2,hippRight_T2) %>%
unite("times3", hippLeft_T3,hippRight_T3) %>%
gather("times","Hipp",times1:times3) %>%
separate(Hipp,c("Left","Right")) %>%
gather("Side","Hipp",Left:Right)

笔记:
  • 第一 unite每次的左右列T1 , T2 , 和 T3并命名这些列 times1 , times2 , 和 times3
  • 然后,gather这三列命名键列 times和值列 Hipp
  • separate Hipp列成LeftRight
  • gather LeftRight命名键列的列 Side和值列 Hipp

  • 其实更好的办法是把这两个 gather颠倒过来通过首先联合起来的操作:
    library(tidyr)
    long <- mydata %>% unite("Left", hippLeft_T1,hippLeft_T2,hippLeft_T3) %>%
    unite("Right", hippRight_T1,hippRight_T2,hippRight_T3) %>%
    gather("Side","Hipp",Left:Right) %>%
    separate(Hipp,c("times1","times2","times3")) %>%
    gather("times","Hipp",times1:times3)

    第三种方法只调用一次 gather是:
    library(dplyr)
    library(tidyr)
    long <- mydata %>% gather("Side","Hipp",-SID) %>%
    mutate(times=paste0("times",sub(".*(\\d)$","\\1",Side)),
    Side=sub("^hipp([A-z]+)_T.*","\\1",Side)) %>%
    select(SID,Side,times,Hipp)

    在这里,关键列 Side来自 gather具有原始值 mydata列名。我们使用 deployer::mutate创建名为 times 的此列的副本.然后我们使用 sub用一些正则表达式提取 times 的最后一位数字值并提取 LeftRightSide值。

    将种子设置为 123 ,您的数据是:
    set.seed(123)
    mydata <- data.frame(SID=sample(1:150,400, replace=TRUE), hippLeft_T1=sample(6000:8000,400,replace=TRUE), hippRight_T1=sample(6000:8000,400,replace=TRUE),hippLeft_T2=sample(6000:8000,400,replace=TRUE), hippRight_T2=sample(6000:8000,400,replace=TRUE),hippLeft_T3=sample(6000:8000,400,replace=TRUE), hippRight_T3=sample(6000:8000,400,replace=TRUE))
    head(mydata)
    ## SID hippLeft_T1 hippRight_T1 hippLeft_T2 hippRight_T2 hippLeft_T3 hippRight_T3
    ##1 44 7973 6941 7718 7279 6319 7465
    ##2 119 6274 6732 7775 6249 6289 7220
    ##3 62 7811 6242 6978 6510 6298 6448
    ##4 133 7153 6094 7436 7641 7029 7833
    ##5 142 6791 6525 6973 7608 6986 7606
    ##6 7 6900 7938 7978 6091 7233 6625

    使用第二种或第三种方法的结果是:
    print(long)
    ## SID Side times Hipp
    ## 1 44 Left times1 7973
    ## 2 119 Left times1 6274
    ## 3 62 Left times1 7811
    ## 4 133 Left times1 7153
    ## 5 142 Left times1 6791
    ## 6 7 Left times1 6900
    ## ...
    ## 401 44 Right times1 6941
    ## 402 119 Right times1 6732
    ## 403 62 Right times1 6242
    ## 404 133 Right times1 6094
    ## 405 142 Right times1 6525
    ## 406 7 Right times1 7938
    ## ...
    ## 801 44 Left times2 7718
    ## 802 119 Left times2 7775
    ## 803 62 Left times2 6978
    ## 804 133 Left times2 7436
    ## 805 142 Left times2 6973
    ## 806 7 Left times2 7978
    ## ...
    ##1201 44 Right times2 7279
    ##1202 119 Right times2 6249
    ##1203 62 Right times2 6510
    ##1204 133 Right times2 7641
    ##1205 142 Right times2 7608
    ##1206 7 Right times2 6091
    ## ...
    ##1601 44 Left times3 6319
    ##1602 119 Left times3 6289
    ##1603 62 Left times3 6298
    ##1604 133 Left times3 7029
    ##1605 142 Left times3 6986
    ##1606 7 Left times3 7233
    ## ...
    ##2001 44 Right times3 7465
    ##2002 119 Right times3 7220
    ##2003 62 Right times3 6448
    ##2004 133 Right times3 7833
    ##2005 142 Right times3 7606
    ##2006 7 Right times3 6625

    关于r - 两级纵向数据 : how to reshape?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706170/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com