2017-06-21 52 views
1

這是特徵工程的一部分,它根據名爲Col的列彙總每個ID。相同的預處理將應用於測試集。由於數據集很大,基於data.table的解決方案可能更受歡迎。如何快速獲取data.table中的計數摘要。

訓練輸入:

ID Col 
A M 
A M 
A M 
B K 
B M 

預期輸出上述訓練輸入:

ID Col_M Col_K 
A 3  0  # A has 3 M in Col and 0 K in Col 
B 1  1 

以上是用於處理的訓練數據。對於測試數據集,如果需要通過Col_M,Col_K進行映射,也就是說,如果其他值如S出現在Col中,則會被忽略。

測試輸入:

ID Col 
C M 
C S 

預期輸出對於上述的測試輸入:

ID Col_M Col_K 
C 1  0  # A has 1 M in Col and 0 K in Col. S value is ignored 
+0

你能添加一些段落解釋什麼顯示?虛擬代碼可以幫助創建良好的答案:) – pachamaltese

+0

如果你實際上安裝了R,並且data.table包也是如此,那麼這裏有:https://stackoverflow.com/q/18881073/只需定義你自己的'inds'值。 – Frank

+0

@pachamaltese,是的,剛剛添加。 – HappyCoding

回答

1

一個可能的data.table實現可以先由c("M", "K")過濾,然後添加這些級別(如果它們不存在,就像第二種情況下那樣),然後運行dcast,同時指定drop = FALSE, fill = 0L(對於缺少其中一個所需級別的情況),同時指定fun = length (爲了計數)。

測試對兩個數據集

library(data.table) 

### First example 
df <- fread("ID Col 
A M 
A M 
A M 
B K 
B M") 

dcast(df[Col %in% c("M", "K")], # Work only with c("M", "K") 
     ID ~ factor(Col, levels = union(unique(Col), c("M", "K"))), # Add missing levels 
     drop = FALSE, # Keep missing levels in output 
     fill = 0L, # Fill missing values with zeroes instead of NAs 
     fun = length) # Count. you can also specify 'value.var' 

# ID M K 
# 1: A 3 0 
# 2: B 1 1 

### Second example 
df <- fread("ID Col 
C M 
C S") 

dcast(df[Col %in% c("M", "K")], 
    ID ~ factor(Col, levels = union(unique(Col), c("M", "K"))), 
    drop = FALSE, 
    fill = 0L, 
    fun = length) 

# ID M K 
# 1: C 1 0 
+0

感謝您的回答和詳細解釋。該解決方案足夠普遍。你能夠參加上述兩個擴展嗎? – HappyCoding

+0

你正在把它變成一個[變色龍問題](https://meta.stackoverflow.com/questions/266767/what-is-the-the-best-way-to-ask-follow-up-questions)。獲得答案後,​​您無法添加新的編輯。添加一個窗口函數是一個全新的問題。 –

+0

感謝您的建議。請在https://stackoverflow.com/questions/44688711/how-to-get-quick-summary-in-data-table-with-a-look-back-window找到新問題。 – HappyCoding

0

我不知道你有多大的數據以及如何靈活預期的代碼是應該的,但我有這個:

zz = ' 
ID Col 
A M 
A M 
A M 
B K 
B M 
' 

df <- read.table(text = zz, header = TRUE) 
col = as.data.frame(table(df)) 

out <- reshape(col, idvar = "ID", 
       timevar = "Col", direction = "wide") 
out 

它給你:

> out 
    ID Freq.K Freq.M 
1 A  0  3 
2 B  1  1 

而對於第二個數據幀:

yy = ' 
ID Col 
C M 
C S 
' 

df1 <- read.table(text = yy, header = TRUE) 
col1 = as.data.frame(table(df1)) 

out1 <- reshape(col1, idvar = "ID", 
       timevar = "Col", direction = "wide") 
out1 

你:

> out1 
    ID Freq.M Freq.S 
1 C  1  1 

然後,只需把它們合併在一起,並刪除冗餘:

ss = merge(out1, out, all.y = T, all.x = T) 
ss 
    ID Freq.M Freq.S Freq.K 
1 C  1  1  NA 
2 A  3  NA  0 
3 B  1  NA  1 
+0

他們所需的輸出不包含「S」列。 –

+0

沒錯。如果這是好的,我正在等待評論,然後我編輯代碼的最後一位以將'S' col和sub'NAs'清除爲'0'。 – AK88

0
> library(data.table) 
> dt=NULL 
> dt$ID=c("A","A","A","B","B") 
> dt$Col=c("M","M","M","K","M") 
> dt=data.frame(dt) 
> dt=data.table(dt) 
> dt 
    ID Col 
1: A M 
2: A M 
3: A M 
4: B K 
5: B M 


> a=dt[Col=="M",sum(.N),ID] 
> b=dt[Col=="K",sum(.N),ID] 
> a 
    ID V1 
1: A 3 
2: B 1 
> b 
    ID V1 
1: B 1 
> setkey(a,ID) 
> setkey(b,ID) 

> m=b[a] 
> m 
    ID V1 i.V1 
1: A NA 3 
2: B 1 1 
> names(m)=c("ID","Col_K","Col_M") 
> m 
    ID Col_K Col_M 
1: A NA  3 
2: B  1  1 
+0

由於大數據考慮,使用data.table代碼進行選擇和合並 –

+0

這對於第二個示例是否也能正常工作? –

+0

它應該是因爲選擇僅適用於M和K,在合併之前 –