2014-01-31 39 views
0

我試圖重塑以下data.table喜歡應急表(不完全是因爲我不希望得到的頻率值,我只是想爲0或1):如何在R中重新構造data.table或data.farme而不增加頻率?

Df的:

ID   CC 
990081899A CC2 
990081899A CC115 
990081899A CC39 
990081899A CC39 
990081899A CC115 
990002362D CC2 
990002362D CC115 
990002362D CC115 
990002362D CC115 
990002362D CC6 
990042716D CC2 

我想兩件事情,但得到相同的結果如下:

第一:

Contingency<-with(Df, table(ID,CC)) 
Diag6<- cbind(ID = rownames(Contingency), apply(Contingency, 2 , as.character)) 

二:

我添加值列在像值= 1的數據: Df的:

ID   CC Value 
990081899A CC2 1 
990081899A CC115 1 
990081899A CC39 1 
990081899A CC39 1 
990081899A CC115 1 
990002362D CC2 1 
990002362D CC115 1 
990002362D CC115 1 
990002362D CC115 1 
990002362D CC6 1 
990042716D CC2 1 

,並試圖:

Df<- data.table(dcast(Df,ID~CC,value.var="Value"),key="ID") 

兩個結果都相同:

ID CC115 CC2 CC39 CC6 
990081899A 2 1 2 0 
990002362D 3 1 0 1 

在這裏,我不想要的頻率,我只是想如果它存在的價值應該是一個否則0:

ID  CC115 CC2 CC39 CC6 
990081899A 1 1 1 0 
990002362D 1 1 0 1 

任何建議,非常感謝。

+0

快速的解決方法可能只是更換0 1 – Ananta

+0

謝謝阿南塔比你其它值,這是最後的選擇,但我的數據量太大,所以我所有正值轉換爲1避免額外的代碼行。 – nsDataSci

回答

2

只需使用table(DF)即可爲您提供佈局。
然後你可以使用sign

 sign(table(DF)) 

       CC 
    ID   CC115 CC2 CC39 CC6 
     990002362D  1 1 0 1 
     990042716D  0 1 0 0 
     990081899A  1 1 1 0 
0

你可以通過自己的函數來dcast

dcast(DF, ID~CC, fun = function(x) as.integer(length(x)>0)) 
# Using CC as value column: use value.var to override. 
#   ID CC115 CC2 CC39 CC6 
# 1 990002362D  1 1 0 1 
# 2 990042716D  0 1 0 0 
# 3 990081899A  1 1 1 0 

或傳遞降低data.frame含有獨特的組合

dcast(unique(DF), ID~CC,fun=length,value.var = 'CC') 
+0

最後我用了這樣的東西,非常感謝。 – nsDataSci

1

我敢肯定這樣做(有或沒有data.table)這已經在某個地方回答過了,但table應該可以做到這一點:

with(unique(dat), table(ID,CC)) 

#   CC 
#ID   CC115 CC2 CC39 CC6 
# 990002362D  1 1 0 1 
# 990042716D  0 1 0 0 
# 990081899A  1 1 1 0 

你可以用上面的一樣:

as.data.frame.matrix(with(unique(dat), table(ID,CC))) 

...如果你喜歡的輸出。

#   CC115 CC2 CC39 CC6 
#990002362D  1 1 0 1 
#990042716D  0 1 0 0 
#990081899A  1 1 1 0 
+0

感謝這應該工作,真的很感激。 – nsDataSci