我有一個大(12萬行)data.table
它是這樣的:如何以編程方式基於data.table中的分類變量創建二進制列?
library(data.table)
set.seed(123)
dt <- data.table(id=rep(1:3, each=5),y=sample(letters[1:5],15,replace = T))
> dt
id y
1: 1 b
2: 1 d
3: 1 c
4: 1 e
5: 1 e
6: 2 a
7: 2 c
8: 2 e
9: 2 c
10: 2 c
11: 3 e
12: 3 c
13: 3 d
14: 3 c
15: 3 a
我想創建一個新的data.table
包含我的變量id
(這將是這個新data.table
獨特的鍵)和其他5二進制變量,每個對應於y
的每個類別,如果該值具有y
的該值,則其值爲1
,否則爲0
。
輸出data.table
應該是這樣的:
id a b c d e
1: 1 0 1 1 1 1
2: 2 1 0 1 0 1
3: 3 1 0 1 1 1
我試着在一個循環中這樣做,但它是相當緩慢的,也不知如何以編程方式通過二元變量名,因爲它們依賴於變量我試圖「分裂」。
編輯:作爲@mtoto指出,類似的問題已經被問和回答here,但解決的辦法是使用reshape2
包。
我想知道是否有另一種(更快)的方式來做到這一點,可能在data.table中使用:=
運算符,因爲我有一個龐大的數據集,我在這個包中工作很多。
EDIT2:在@ Arun的崗位上我的數據的功能指標(〜1200萬行,〜3.5萬個不同的ID和490個不同的標籤爲y
變量(導致490個虛擬變量)):
system.time(ans1 <- AnsFunction()) # 194s
system.time(ans2 <- dcastFunction()) # 55s
system.time(ans3 <- TableFunction()) # Takes forever and blocked my PC
我注意到有類似的行,如四,五,你能解釋一下這個數據更好一點?據我所知,'data [1] [e] = 1 if(2> 0)else 0'但它看起來有點奇怪。 – kpie
[如何使用強制轉換或其他函數在R中創建二進制表]可能的重複(http://stackoverflow.com/questions/11659128/how-to-use-cast-or-another-function-to-create -a-binary-table-in-r) – mtoto
@kpie我編輯了第二個'data.table',現在應該更清楚了:'id' n.1的distinc值爲'b,c,d,e'爲'y',但不是'a'。這就解釋了爲什麼他在第二個'data.table'上的行在'a'列除了'a'外都有'1'。 @mtoto感謝您的回答,這將解決我的問題,但是對於如此龐大的數據,我想知道是否有另一種方法可以在'data.table'內執行相同的操作,也許使用':='操作符。 – hellter