【问题标题】:Dataframe reshape/transpose using dplyr使用 dplyr 重塑/转置数据框
【发布时间】:2018-04-24 09:49:37
【问题描述】:

我有以下格式的数据框 Original format

对于给定的 ID;年龄、性别和身份保持不变。

我想做一些转换

  1. 每个“Id”和“Type”都有一行。
  2. 在“Tablet”列中查找唯一值并进行转置。
  3. 转置“Level”列,并在新转置的 tablet 列下具有与每个 tablet 对应的值。空单元格必须用“NA”填充。

下面附上所需的输出格式以供参考。desired format

我尝试过使用 dcast 和 reshape; tidyr 与 dplyr 使用收集和传播,但无法实现第三次转换

任何帮助都会很棒!谢谢

【问题讨论】:

标签: r dplyr reshape transpose


【解决方案1】:

您可以使用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')
  )

使用group_by() 通过 id 和类型获取结果。

使用spread() 转置数据,其中tablet 列包含列名称的键,level 列包含值。 spread() 默认会用NA 填空。

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

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

【讨论】:

  • 谢谢安德鲁。该代码几乎可以完美运行。我想在一行中有一个样本 ID 的所有级别。现在我得到 4 行 ID“1”和 2 行 ID“2”。尝试合并和合并..运气不太好..最后通过切片“填充(一切(),.direction =“向下”)%>%填充(一切(),.direction =“向上”) %>% slice(1)" .. 虽然性能不是很好。对任何替代方案的建议?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2022-11-21
相关资源
最近更新 更多