代码之家  ›  专栏  ›  技术社区  ›  Simon Harmel

基于R中tidyverse中变量后缀的长到宽格式

  •  1
  • Simon Harmel  · 技术社区  · 2 年前

    我想知道是否有办法 DATA 重新格式化为我的 Desired_output 在下面

    具体来说,对于每个唯一的 study ,我们粘在一起 pre postNUMBER 一起,单独用于 T C .

    ps.如果 学习 在里面 数据 ,没有 之前 (仅由postNUMBER组成)或postNUMBER(仅由组成 之前 ),我们只是将其排除在外(在这种情况下, Jasmi Zill 研究被排除在外)。

    我尝试了以下操作,但没有成功:

    DATA <- read.table(header=TRUE,text="
    study    year    mT   sdT    nT    mC   sdC    nC  time
    Al_Ajmi  2015  1.68  1.07    25  1.44  1.08    31  pre
    Al_Ajmi  2015  7.4   2.22    25  1.08  1.12    31  post1
    Al_Ajmi  2015  8.08  1.75    25  1.48  1.08    31  post2
    Jasmi    2020  1.3   1       30  2     1       30  pre
    Zill     2019  2     1       41  3     2       32  post1
    Zill     2019  3     3       41  1     1       32  post2")
    
    
    Desired_output <- read.table(header=T, text="
    study    year    time         group  n    mpre     mpost  sdpre  sdpost
    Al_Ajmi  2015    pre-post1    T      25   1.68     7.4    1.07   2.22
    Al_Ajmi  2015    pre-post2    T      25   1.68     8.08   1.07   1.75
    Al_Ajmi  2015    pre-post1    C      31   1.44     1.08   1.08   1.12
    Al_Ajmi  2015    pre-post2    C      31   1.44     1.48   1.08   1.08
    ")
    
    # I tried the following without success:
    library(tidyverse)
    dat8 <- DATA %>% pivot_longer(nT:sdC, 
                            names_to = c(".value","group"),
                            names_pattern = "(n|m|sd)(T|C)") 
    
    output <- 
      left_join(filter(dat8, time !="pre"),
                filter(dat8, time =="pre"),
                by = c("study","group"),
                suffix= c("post","pre") ) %>% 
      select(study:sdpost,npre:sdpre) %>% 
      rename_with(~str_remove(.,"post"), -c("mpost","sdpost")) %>% 
      mutate(time=recode(time, "post1"="pre-post1", "post2"="pre-post2")) %>% 
      arrange(study, group)
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Axeman    2 年前

    您没有旋转所有列:

    dat8 <- DATA %>% pivot_longer(
      mT:nC, # change here
      names_to = c(".value", "group"),
      names_pattern = "(m|n|sd)(T|C)"
    )
    

    其他一切似乎都是正确的?