我几天前问过同一个问题( click here),但未提及使用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
y
中的变量df
应该被打破,以便其元素是新变量,每个虚拟编码。所有其他变量(在这种情况下只是z
)对于每个人(p1,p2等)都是相等的。特定人员p具有不同值的唯一变量是y
我想要这个的原因是因为我需要通过变量x
将此数据集与其他数据集合并。事实是,它需要每人一行(p1
,p2
等)。
答案 0 :(得分: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
部分加入了唯一x
和y
的所有组合,然后在该联接中有一个隐藏的 by-without-by 用于通过.N
计算计数。一旦你有了这些,只需要将每个x
和任何非NA z
(我选择第一个)放在水平位置,并使用as.list
完成。最后setNames
正确设置列名称。