使用dplyr对数据帧进行整形/转置

使用dplyr对数据帧进行整形/转置,r,dplyr,reshape,transpose,R,Dplyr,Reshape,Transpose,我有一个以下格式的数据框 对于给定的ID;年龄、性别和地位保持不变 我想做一些转换 每个“Id”和“类型”都有一行 在“Tablet”列中找到唯一值并进行转置 将“Level”列转置,并在新转置的tablet列下具有与每个tablet对应的值。空单元格必须用“NA”填充 所需的输出格式附在下面以供参考 我尝试过使用dcast和重塑;tidyr和dplyr使用聚集和扩散,但是我无法实现第三次转换 任何帮助都会很好!谢谢您可以使用tidyr软件包中的spread()功能: 设置包和数据: libr

我有一个以下格式的数据框

对于给定的ID;年龄、性别和地位保持不变

我想做一些转换

  • 每个“Id”和“类型”都有一行
  • 在“Tablet”列中找到唯一值并进行转置
  • 将“Level”列转置,并在新转置的tablet列下具有与每个tablet对应的值。空单元格必须用“NA”填充
  • 所需的输出格式附在下面以供参考

    我尝试过使用dcast和重塑;tidyr和dplyr使用聚集和扩散,但是我无法实现第三次转换


    任何帮助都会很好!谢谢

    您可以使用
    tidyr
    软件包中的
    spread()
    功能:

    设置包和数据:

    library(dplyr)
    library(tidyr)
    
    
     df=data.frame(
      id=c(1,1,1,1,1,2,2),
      age=c(3,3,3,3,3,51,51),
      sex=c('f','f','f','f','f','m','m'),
      type=c('a','a','a','b','b','a','a'),
      tablet=c('t1','t2','t3','t1','t5','t3','t10'),
      level=c(1,2,3,1,4,2,3),
      status=c('n','n','n','n','n','y','y')
      )
    
    使用
    groupby()
    按id和类型获取结果

    使用
    spread()
    将数据与包含列名键的
    tablet
    列和包含值的
    level
    列进行转换<代码>排列()默认情况下将用
    NA
    填充空格

    使用
    select()
    将列重新排列为所需格式:

    df %>% 
      group_by(id,type) %>% 
      spread(tablet, level) %>% 
      select(id,age,sex,type,t1,t2,t3,t5,t10,status)
    

    您可以在
    tidyr
    软件包中使用
    spread()
    函数:

    设置包和数据:

    library(dplyr)
    library(tidyr)
    
    
     df=data.frame(
      id=c(1,1,1,1,1,2,2),
      age=c(3,3,3,3,3,51,51),
      sex=c('f','f','f','f','f','m','m'),
      type=c('a','a','a','b','b','a','a'),
      tablet=c('t1','t2','t3','t1','t5','t3','t10'),
      level=c(1,2,3,1,4,2,3),
      status=c('n','n','n','n','n','y','y')
      )
    
    使用
    groupby()
    按id和类型获取结果

    使用
    spread()
    将数据与包含列名键的
    tablet
    列和包含值的
    level
    列进行转换<代码>排列()默认情况下将用
    NA
    填充空格

    使用
    select()
    将列重新排列为所需格式:

    df %>% 
      group_by(id,type) %>% 
      spread(tablet, level) %>% 
      select(id,age,sex,type,t1,t2,t3,t5,t10,status)
    

    这与你的作业不完全相同,但应该足够接近。如果没有,请考虑使用MVCE元素进行重新发布。这与你的作业不完全相同,但应该足够接近。如果没有,请考虑使用MVCE元素进行重新发布。谢谢安德鲁。代码工作得近乎完美。我希望将样本ID的所有级别都放在一行中。现在我得到了ID为“1”的4行和ID为“2”的2行。尝试合并和合并。。运气不太好。。通过执行一个切片“fill(everything(),.direction=“down”)%%>%fill(everything(),.direction=“up”)%%>%slice(1)”,最终使其工作。。不过表演并不精彩。有什么建议吗?谢谢安德鲁。代码工作得近乎完美。我希望将样本ID的所有级别都放在一行中。现在我得到了ID为“1”的4行和ID为“2”的2行。尝试合并和合并。。运气不太好。。通过执行一个切片“fill(everything(),.direction=“down”)%%>%fill(everything(),.direction=“up”)%%>%slice(1)”,最终使其工作。。不过表演并不精彩。有什么建议吗?