2017-11-11 125 views
0

我在下面格式 Original format数据帧重塑/转使用dplyr

对于给定的ID的数据帧;年龄,性别和地位保持不变。

我想要做的一对夫妇转变

  1. 有每个“ID”和“类型”一行。
  2. 在“平板电脑”列中查找唯一值并进行转置。
  3. 移调“级别”列,并具有与新转置的平板电脑列下的每个平板电脑相对应的值。必须用“NA”填充空单元格。

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

我试过使用dcast和重塑; tidyr与dplyr使用收集和传播,但是不能实现第三次转换

任何帮助将是伟大的!由于

+2

这不是你的任务相当重复的,但它应该是足够https://stackoverflow.com/questions/10589693接近。如果不是,请考虑重新发布mvce元素。 https://stackoverflow.com/help/mcve – wibeasley

回答

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) 
+0

谢谢安德鲁。代码工作接近完美。我想在一行中为所有级别的样本ID。现在我得到4行ID“1”和2行ID 2“。尝试合并和合并..没有多少运气..终于得到它通过做一个切片“填充(一切(),。方向=”下“)%>% fill(everything(),.direction =”up“ )%>% slice(1)“..虽然性能不是很好。任何替代方案的建议? – Vinds