一种重塑操作

时间:2015-02-24 16:56:45

标签: r

说我有

dta <- data.frame(
  id_1=as.integer(runif(1000,0,20) * 20),
  id_2=as.integer(runif(1000,0,5) * 5),
  X=LETTERS[as.integer(cut(runif(5),0:3/3))]
  )

我想用三列A,B,C替换X.如果在dta中为id_1和id_2的特定组合观察到具有与新表名对应的值的X,则这些列的值将为TRUE ,否则为FALSE。作为一个非常简单的例子:

id_1 = {1, 1, 3}
id_2 = {1, 1, 2}
X  = {A, B, A}

会变成:

id_1 = {1, 3}
id_2 = {1, 2}
A = {TRUE, TRUE}
B = {TRUE, FALSE}
C = {FALSE, FALSE}

我认为这是一种重塑操作,但不能想到如何使用常用功能来实现。

更新

我认为以下工作: 使用dplyr:

dta  %>% 
distinct  %>% 
mutate(y=1)  %>% 
spread(X, y, fill=FALSE)  

然而,每行的总和仅为“1”,因此需要一些额外的合并

2 个答案:

答案 0 :(得分:1)

以下是基础R解决方案:

aggregate(X~id_1+id_2,dta,table)

答案 1 :(得分:1)

另一种解决方案:

library(reshape2)
dcast(dta, id_1+id_2~X, value.var='X', 
      fun.aggregate= function(x) as.logical(length(x)))