2016-05-18 7 views
10

मैं है निम्नलिखित समस्या है, जो शायद एक बहुत सरल उपाय है: जब मैं का उपयोगdata.table कहां से पहले द्वारा

library (data.table) 
actions = data.table(User_id = c("Carl","Carl","Carl","Lisa","Moe"), 
        category = c(1,1,2,2,1), 
        value= c(10,20,30,40,50)) 

    User_id category value 
1: Carl  1 10 
2: Carl  1 20 
3: Carl  2 30 
4: Lisa  2 40 
5:  Moe  1 50 

actions[category==1,sum(value),by= User_id] 

समस्या है, जाहिरा तौर पर यह पता पंक्तियों को पहले प्रकार जहां श्रेणी 1 है कि और उसके बाद कमांड का उपयोग करता है। तो क्या मैं मिलता है:

User_id V1 
1: Carl 30 
2:  Moe 50 

लेकिन क्या मैं चाहता हूँ है:

User_id V1 
1: Carl 30 
2: Lisa 0 
3:  Moe 50 

मैं उन के बारे में data.table सिर्फ युक्त जानकारी के निर्माण कर रहा हूँ, इसलिए:

users = actions[,User_id,by= User_id] 
users$value_one = actions[category==1,.(value_one =sum(value)),by= User_id]$value_one 

जो त्रुटियों को फेंकता है या गलत मान शामिल है, जब कुछ ऐसे उपयोगकर्ता हैं जिनके पास कोई प्रविष्टि नहीं है।

+0

आप 'इस्तेमाल कर सकते हैं कार्यों [, योग (ifelse (श्रेणी == 1, मान, 0)), द्वारा = उपयोगकर्ता_आईडी] '। – nrussell

+0

आईआईयूसी [एफआर # 788] से संबंधित (https://github.com/Rdatatable/data.table/issues/788) – MichaelChirico

उत्तर

11

यह लगभग संक्षिप्त है, और काम पूरा हो जाता है।

actions[, .SD[category==1, sum(value)], by=User_id] 
# User_id V1 
# 1: Carl 30 
# 2: Lisa 0 
# 3:  Moe 50 

## Or, better yet, no need to muck around with .SD, (h.t. David Arenburg) 
actions[, sum(value[category == 1]), by = User_id] 
# User_id V1 
# 1: Carl 30 
# 2: Lisa 0 
# 3:  Moe 50 

ऊपर के रिश्तेदार अक्षमता आपके उपयोग के मामले में एक समस्या है, तो यहां एक अधिक कुशल विकल्प है:

res <- actions[, .(val=0), by=User_id] 
res[actions[category==1, .(val=sum(value)), by=User_id], val:=i.val, on="User_id"]  
res 
# User_id val 
# 1: Carl 30 
# 2: Lisa 0 
# 3:  Moe 50 
+3

या केवल 'क्रियाएं [, योग (मूल्य [श्रेणी == 1]), = user_id द्वारा] 'एसडी' के साथ गड़बड़ किए बिना। हालांकि, हालांकि ये दृष्टिकोण "लगभग लगभग संक्षिप्त" लगते हैं, लेकिन ओपी क्या करने की कोशिश कर रहा था उससे बहुत कम कुशल हैं क्योंकि आप प्रत्येक * 'user_id' द्वारा केवल एक बार 'category == 1' * द्वारा फ़िल्टर करते हैं। –

+0

@ डेविड एडनबर्ग सहमत हुए। मेरे पास समान गलतफहमी थी, इसलिए बस एक दूसरा, कम संक्षेप में लेकिन अधिक कुशल विकल्प जोड़ा गया। –

+0

अप्रयुक्त स्तरों से निपटने का एक और तरीका 'क्रिया [श्रेणी == 1] [उपयोगकर्ता, योग (मूल्य, na.rm = TRUE), = "User_id" पर = =AACHI] द्वारा विलय होगा। दुर्भाग्यवश, ऐसा लगता है कि 'sum' gForce अनुकूलन को ट्रिगर नहीं करता है अगर na.rm शामिल है – Frank

संबंधित मुद्दे