2016-11-09 78 views
1

我有一個像下面轉換因子變量N個二元變量

id <- c(1,1,1,2,2,2,1,3,4,4) 
product <- c("a","b","c","a","d","f","e","f","e","f") 
df <- data.frame(id,product) 

    id product 
1 1  a 
2 1  b 
3 1  c 
4 2  a 
5 2  d 
6 2  f 
7 1  e 
8 3  f 
9 4  e 
10 4  f 

我想將它轉換爲以下數據幀數據幀一。

id a b c d e f 
1 1 1 1 0 1 0 
2 1 0 0 1 0 1 
3 0 0 0 0 0 1 
4 0 0 0 0 1 1 

從本質上講,我只需要一個記錄每個ID及記錄應包含取決於產品是否購買或不爲0或1。我使用了model.matrix,但它並沒有通過id進行分組,我得到了與原始數據集相同的10行。

+0

不應該這是在StackOverflow? – Jon

+0

可能是一個http://stackoverflow.com/questions/5890584/how-to-reshape-data-from-long-to-wide-format的重複,但沒有信譽關閉。 – AdamO

+0

@ashkan我不認爲這是一個的副本;這裏的結果是一個關聯矩陣,而不是簡單地將現有的長格式重新排列。 –

回答

2

退房的table功能的幫助。

table(id,product) 

將其轉換爲數據幀使用

as.data.frame.matrix(table(id,product)) 

我發現這個技巧在博客中通過Rronan

+0

這不會以所需格式創建數據幀。我可以使用as.data.frame(table(id,product)),它返回24個obs與3個變量,但不是我所期望的。我想要一個帶有4個obs和6個變量的數據框。 – user3897

+0

請參閱@ Glen_b的答案... –

3

reshape命令是柔性的,類似於PROC TRANSPOSE及其所有idiosyncracies。它會給你id作爲輸出變量的值,遺漏值在輸出數據集中未編碼的水平。這很容易處理並反映真實數據(例如,不存在指示負(0)狀況的數據不是輸出中不存在數據)。

df$ind <- 1

reshape(df, direction='wide', timevar='product', idvar='id')

> reshape(df, direction='wide', timevar='product', idvar='id') 
    id ind.a ind.b ind.c ind.d ind.f ind.e 
1 1  1  1  1 NA NA  1 
4 2  1 NA NA  1  1 NA 
8 3 NA NA NA NA  1 NA 
9 4 NA NA NA NA  1  1 

,很容易R鍵做休息。

aggregate起到類似的功能:

'集合體(DF $產品,DF [, 'ID',降= F〕,表)'

給出

> aggregate(df$product, df[, 'id', drop=F], table) 
    id x.a x.b x.c x.d x.e x.f 
1 1 1 1 1 0 1 0 
2 2 1 0 0 1 0 1 
3 3 0 0 0 0 0 1 
4 4 0 0 0 0 1 1 

和它的容易R去做休息。

+0

您可以使這一點更簡單 - 「聚合(product_id,data = df,table)」或「聚合(df [」product「],df [」id「],表)'取決於你的喜好。 – thelatemail

4

as.data.frame.table(這是當你as.data.frame表所謂)相當合理的錶轉換爲長格式。爲了防止這種情況,你需要把它作爲一個矩陣:

as.data.frame.matrix(table(df)) 
    a b c d e f 
1 1 1 1 0 1 0 
2 1 0 0 1 0 1 
3 0 0 0 0 0 1 
4 0 0 0 0 1 1 
1

一種選擇取決於reshape2,還有很多其他的,可能/可能不會需要一些按摩:

> reshape2::dcast(data = df,formula = id~product,fun.aggregate = length,fill = 0L) 
Using product as value column: use value.var to override. 
    id a b c d e f 
1 1 1 1 1 0 1 0 
2 2 1 0 0 1 0 1 
3 3 0 0 0 0 0 1 
4 4 0 0 0 0 1 1