2013-08-21 36 views
3

我也问过同样的问题,前几天( click here),但没有提到使用data.table结果,将不胜感激使用data.table包重塑数据

的“总解决方案”工作正常,尽管它很慢!我正在寻找更快的方法来解决这个问题。

我要重塑以下data.frame:

df <- data.frame(x=c("p1","p1","p2"),y=c("a","b","a"),z=c(14,14,16)) 
df 
    x y z 
1 p1 a 14 
2 p1 b 14 
3 p2 a 16 

,使它看起来像这样的:

df2 <- data.frame(x=c("p1","p2"),a=c(1,1),b=c(1,0),z=c(14,16)) 
    x a b z 
1 p1 1 1 14 
2 p2 1 0 16 

df变量y应该破坏,使得它的元素是新的变量,每个虚拟编码。所有其他变量(在本例中仅为z)对于每个人(p1,p2等)都是相等的。特定人员p具有不同值的唯一变量是y
我想要这个的原因是因为我需要通过变量x将此数据集与其他数据集合并。事情是,它需要每人一排(p1,p2等)。

+0

我应该做到这一点,但是当我发布这个问题时,我只是没有考虑到“自包含方面”。因为eddi已经发布了一种方式,我想我会保持原样。但是,感谢您的评论 – beginneR

回答

5

将宽幅目前在data.table有点别扭,但我想这样的作品:

library(data.table) 
dt = data.table(x=c("p1","p1","p2"),y=c("a","b","a"),z=c(14,14,16)) 

setkey(dt, x, y) 
dt[CJ(unique(x), unique(y)), list(.N, z)][, 
    setNames(as.list(c(N, z[!is.na(z)][1])), c(y, 'z')), by = x] 
# x a b z 
#1: p1 1 1 14 
#2: p2 1 0 16 

CJ部分通过独特的xy所有组合连接,然后在加入有一隐藏by-by-by-用于通过.N计算计数。一旦你有了这些,只需将每个x与任何非NA z(我选择第一个)一起水平放置,并使用as.list完成。最后setNames正确设置列名。

+0

你能解释一下如何工作。谢谢 – beginneR

+1

@ beginneR解释添加 – eddi

+0

谢谢,这太棒了!但现在变得更加复杂。如果存在另一个像y那样的变量,例如z,该怎么办?价值也可能不同。是否有可能调整此场景的代码。 thelatemail编辑了我在这里链接的问题的第一个答案,使用Aggregate为两个以上的列。如果这也可以为你的data.table解决方案完成,那将是完美的。另请参阅我对关联问题中“他的”答案的评论。 (PS:抱歉链接到另一个问题) – beginneR