【发布时间】:2016-07-01 22:01:00
【问题描述】:
我们以虹膜数据为例,稍作修改:
(注意:使用“UPDATE #1”部分的 4 行代替下面的两行)
data(iris)
iris$id <- rep(1:50, times = 3)
我需要将数据从这种 quazi-long 格式转换为宽格式,以便每一行中的 id 都是相同的。换句话说:原始的iris数据可以看作是一张贴在一张下面的3张表格(每个物种一张)。我需要将这 3 张表粘贴到另一张的一侧。
这很简单,我就是这样做的:
require(purrr)
require(dplyr)
iris %>% split(.$Species) %>% reduce( full_join, by = "id")
上面的示例生成的名称类似于“Petal.Length.x”、...、“Petal.Length.y”、...、“Petal.Length”。我希望它们是:“Petal.Length.setosa”,...,“Petal.Length.versicolor”,...,“Petal.Length.virginica”。所以唯一剩下的就是将物种名称附加到原始变量名称中。
我尝试在reduce 之前使用map 和setNames,但没有成功。
我不想使用 tidyr 的 gather 和 separate,因为我的 1.5GB 数据集以纯长格式增长到 13GB(我需要保留很多类似 id 的列)。
我可以使用names、gsub 和一些基本的正则表达式在下一行添加名称,但我很好奇是否可以在不破坏%>% 流程的情况下做到这一点。
更新 #1
谢谢你的回复,lmo!一个非常好的和干净的解决方案!当我第一次看到它时,我觉得我想多了这个问题......但实际上我在stackoverflow上过度简化了它。让我们添加一些混乱:
iris$id <- rep(sample(1:50, 50), times = 3) ## random order
iris$drop_me <- sample(c(1,0), 150, TRUE, c(0.8, 0.2)) ## rows wirh 0 in this column will be missing
iris <- iris[iris$drop_me == 1, ]
iris$drop_me <- NULL
所以我有上面的数据,现在我尝试使用reduce...我也从left_join更新到full_join,因为我意识到我跳过了一些结果。
提前谢谢你和问候。
【问题讨论】: