2015-02-24 61 views
2

的說我有A型重塑操作

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替換X,B,C。這些列的值將如果X與對應於該值是TRUE在dta中爲id_1和id_2的特定組合觀察到新的表名,否則爲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',並因此需要

回答

1

一些額外的合併在這裏是基礎R解決方案:

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

另一種解決方案:

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