2015-12-15 8 views
6

मान लीजिए मैं इस डेटासेटआर में पंक्तियों के एक समूह में कुछ पंक्तियां हटाएं

Id Name Price sales Profit Month Category Mode Supplier 
1 A  2  0  0  1  X K  John 
1 A  2  0  0  2  X K  John 
1 A  2  5  8  3  X K  John 
1 A  2  5  8  4  X L  Sam 
2 B  2  3  4  1  X L  Sam 
2 B  2  0  0  2  X L  Sam 
2 B  2  0  0  3  X M  John 
2 B  2  0  0  4  X L  John 
3 C  2  0  0  1  X K  John 
3 C  2  8  10  2  Y M  John 
3 C  2  8  10  3  Y K  John 
3 C  2  0  0  4  Y K  John 
5 E  2  0  0  1  Y M  Sam 
5 E  2  5  5  2  Y L  Sam 
5 E  2  5  9  3  Y M  Sam 
5 E  2  0  0  4  Z M  Kyle 
5 E  2  5  8  5  Z L  Kyle 
5 E  2  5  8  6  Z M  Kyle 

मैं एक निश्चित Id दो या अधिक है, तो के लिए Id समूह तो द्वारा Sales के लिए शून्य और Profit स्तंभ के साथ हुई पंक्तियां हटाना चाहते लगातार पंक्तियों में sales और profit के लिए शून्य मान हैं जो पंक्तियां हटा दी जाएंगी। तो यह डेटासेट इस तरह बन जाएगा।

Id Name Price sales Profit Month Category Mode Supplier 
1 A  2  5  8  3  X K  John 
1 A  2  5  8  4  X L  Sam 
2 B  2  3  4  1  X L  Sam 
3 C  2  0  0  1  X K  John 
3 C  2  8  10  2  Y M  John 
3 C  2  8  10  3  Y K  John 
3 C  2  0  0  4  Y K  John 
5 E  2  0  0  1  Y M  Sam 
5 E  2  5  5  2  Y L  Sam 
5 E  2  5  9  3  Y M  Sam 
5 E  2  0  0  4  Z M  Kyle 
5 E  2  5  8  5  Z L  Kyle 
5 E  2  5  8  6  Z M  Kyle 

मैं अगर वे

df1 = df[!(df$sales==0 & test$Profit==0),] 

साथ Profit शून्य Sales के लिए मूल्यों और लेकिन है सभी पंक्तियों को हटा सकते हैं कि कैसे पहचान

पुनश्च विचार से इस मामले में केवल कुछ समूह में पंक्तियों को हटाना उन उत्पादों के लिए प्रविष्टियों को हटाना है यदि उन्होंने कुछ महीनों के बाद बिक्री शुरू कर दी है या साल के चक्र में कुछ महीनों के बाद त्याग दिया है।

+0

एक सरल कार्य लिखें जो हटाए गए समूहों को शामिल करता है और इसमें शामिल/बहिष्कृत करता है। फिर 'लूपली' के लिए 'लूप' 'डेटा का उपयोग करें।टेबल', या '(डी) प्लीयर' को विभाजित करने के लिए –

उत्तर

5

हैं यहाँ "data.table" से rleid का उपयोग कर एक दृष्टिकोण है:

library(data.table) 
as.data.table(mydf)[, N := .N, by = .(Id, rleid(sales == 0 & Profit == 0))][ 
    !(sales == 0 & Profit == 0 & N >= 2)] 
##  Id Name Price sales Profit Month Category Mode Supplier N 
## 1: 1 A  2  5  8  3  X K  John 2 
## 2: 1 A  2  5  8  4  X L  Sam 2 
## 3: 2 B  2  3  4  1  X L  Sam 1 
## 4: 3 C  2  0  0  1  X K  John 1 
## 5: 3 C  2  8  10  2  Y M  John 2 
## 6: 3 C  2  8  10  3  Y K  John 2 
## 7: 3 C  2  0  0  4  Y K  John 1 
## 8: 5 E  2  0  0  1  Y M  Sam 1 
## 9: 5 E  2  5  5  2  Y L  Sam 2 
## 10: 5 E  2  5  9  3  Y M  Sam 2 
## 11: 5 E  2  0  0  4  Z M  Kyle 1 
## 12: 5 E  2  5  8  5  Z L  Kyle 2 
## 13: 5 E  2  5  8  6  Z M  Kyle 2 
+0

eval (expr, envir, enclos) में त्रुटि: फ़ंक्शन नहीं मिल सका " rleid " इस त्रुटि को मिला, मैंने डेटा.table पैकेज स्थापित और लोड किया है। –

+0

@Jaykhan, आप "data.table" का किस संस्करण का उपयोग कर रहे हैं? आप किस ओएस पर हैं? – A5C1D2H2I1M1N2O1R2T1

+0

1.9.6 की डेटा तालिका और ओएसएक्स एल कप्तान –

1

मैं एक पंक्ति में कर सकते हैं नहीं है, लेकिन यहां यह तीन में है:

x <- df$sales==0 & df$Profit==0 
y <- cumsum(c(1,head(x,-1)!=tail(x,-1))) 
df[ave(x,df$Id,y,FUN=sum)<2,] 

# Id Name Price sales Profit Month Category Mode Supplier 
# 3 1 A  2  5  8  3  X K  John 
# 4 1 A  2  5  8  4  X L  Sam 
# 5 2 B  2  3  4  1  X L  Sam 
# 9 3 C  2  0  0  1  X K  John 
# 10 3 C  2  8  10  2  Y M  John 
# 11 3 C  2  8  10  3  Y K  John 
# 12 3 C  2  0  0  4  Y K  John 
# 13 5 E  2  0  0  1  Y M  Sam 
# 14 5 E  2  5  5  2  Y L  Sam 
# 15 5 E  2  5  9  3  Y M  Sam 
# 16 5 E  2  0  0  4  Z M  Kyle 
# 17 5 E  2  5  8  5  Z L  Kyle 
# 18 5 E  2  5  8  6  Z M  Kyle 

यह पहली सभी पंक्तियों जहां sales और Profit दोनों 0 (x) कर रहे हैं की पहचान करके काम करता है। परिवर्तनीय y लगातार TRUE और FALSE मान समूह। बाद में इनपुट चर (df$Id और y) के अनुसार ave() फ़ंक्शन पहले इनपुट चर (x) को विभाजित करता है) फिर समूहों के भीतर फ़ंक्शन को लागू करता है। चूंकि समारोह sum() है, यह x में सभी TRUE मानों को जोड़ना होगा, तो यह x रूप में एक ही लंबाई का एक वेक्टर देता है, तो हम बस सभी पंक्तियों को रखने के लिए जहां परिणाम कम से कम 2

+0

जब मैंने 500,000 से अधिक पंक्तियों के मूल डेटा पर कोड लागू करने का प्रयास किया, तो यह त्रुटि के साथ टूट जाता है कि लंबे वैक्टर अभी तक समर्थित नहीं हैं: –

3

है जरूरत यहां dplyr के साथ ऐसा करने का तरीका बताया गया है। असल में, मैं केवल उन पंक्तियों को रख रहा हूं जो शून्य नहीं हैं या पिछली/निम्न पंक्तियां शून्य नहीं हैं।

table1 %>% 
group_by(Id) %>% 
mutate(Lag=lag(sales),Lead=lead(sales)) %>% 
rowwise() %>% 
mutate(Min=min(Lag,Lead,na.rm=TRUE)) %>% 
filter(sales>0|Min>0) %>% 
select(-Lead,-Lag,-Min) 

     Id Name Price sales Profit Month Category Mode Supplier 
    (int) (chr) (int) (int) (int) (int) (chr) (chr) (chr) 
1  1  A  2  5  8  3  X  K  John 
2  1  A  2  5  8  4  X  L  Sam 
3  2  B  2  3  4  1  X  L  Sam 
4  3  C  2  0  0  1  X  K  John 
5  3  C  2  8  10  2  Y  M  John 
6  3  C  2  8  10  3  Y  K  John 
7  3  C  2  0  0  4  Y  K  John 
8  5  E  2  0  0  1  Y  M  Sam 
9  5  E  2  5  5  2  Y  L  Sam 
10  5  E  2  5  9  3  Y  M  Sam 
11  5  E  2  0  0  4  Z  M  Kyle 
12  5  E  2  5  8  5  Z  L  Kyle 
13  5  E  2  5  8  6  Z  M  Kyle 

डाटा

table1 <-read.table(text=" 
Id,Name,Price,sales,Profit,Month,Category,Mode,Supplier 
1,A,2,0,0,1,X,K,John 
1,A,2,0,0,2,X,K,John 
1,A,2,5,8,3,X,K,John 
1,A,2,5,8,4,X,L,Sam 
2,B,2,3,4,1,X,L,Sam 
2,B,2,0,0,2,X,L,Sam 
2,B,2,0,0,3,X,M,John 
2,B,2,0,0,4,X,L,John 
3,C,2,0,0,1,X,K,John 
3,C,2,8,10,2,Y,M,John 
3,C,2,8,10,3,Y,K,John 
3,C,2,0,0,4,Y,K,John 
5,E,2,0,0,1,Y,M,Sam 
5,E,2,5,5,2,Y,L,Sam 
5,E,2,5,9,3,Y,M,Sam 
5,E,2,0,0,4,Z,M,Kyle 
5,E,2,5,8,5,Z,L,Kyle 
5,E,2,5,8,6,Z,M,Kyle 
",sep=",",stringsAsFactors =FALSE, header=TRUE) 

अद्यतन इन मानदंडों के साथ एक से अधिक स्तंभ पर फ़िल्टर करने के लिए, यहाँ इसे कैसे करना है। वर्तमान मामले में, परिणाम एक ही है क्योंकि जब बिक्री 0 कर रहे हैं, लाभ भी 0.

library(dplyr) 
table1 %>% 
group_by(Id) %>% 
mutate(LagS=lag(sales),LeadS=lead(sales),LagP=lag(Profit),LeadP=lead(Profit)) %>% 
rowwise() %>% 
mutate(MinS=min(LagS,LeadS,na.rm=TRUE),MinP=min(LagP,LeadP,na.rm=TRUE)) %>% 
filter(sales>0|MinS>0|Profit>0|MinP>0) %>%   # "|" means OR 
select(-LeadS,-LagS,-MinS,-LeadP,-LagP,-MinP) 
+0

वैसे, ओपी चाहता है कि यह काफी नहीं है। वांछित परिणाम की लाइन 8 देखें। – DatamineR

+0

मैंने इसे ठीक करने के लिए अपना जवाब संपादित किया। –

+0

@PLapointe एक परिवर्तनीय बिक्री के आधार पर इसे हटाने, सही? मैं पंक्तियों को 2 या अधिक चर मूल्य के आधार पर शून्य से हटाना चाहता हूं। उसको कैसे करे? –

1

यहाँ मेरी समाधान :

aux <- lapply(tapply(df$sales + df$Profit, df$Id, rle), function(x) 
     with(x, cbind(rep(values, lengths), rep(lengths, lengths)))) 

df[!(do.call(rbind, aux)[,1]==0 & do.call(rbind, aux)[,2] >= 2),] 

    Id Name Price sales Profit Month Category Mode Supplier 
3 1 A  2  5  8  3  X K  John 
4 1 A  2  5  8  4  X L  Sam 
5 2 B  2  3  4  1  X L  Sam 
9 3 C  2  0  0  1  X K  John 
10 3 C  2  8  10  2  Y M  John 
11 3 C  2  8  10  3  Y K  John 
12 3 C  2  0  0  4  Y K  John 
13 5 E  2  0  0  1  Y M  Sam 
14 5 E  2  5  5  2  Y L  Sam 
15 5 E  2  5  9  3  Y M  Sam 
16 5 E  2  0  0  4  Z M  Kyle 
17 5 E  2  5  8  5  Z L  Kyle 
18 5 E  2  5  8  6  Z M  Kyle 
+0

जब मैंने 500,000 से अधिक पंक्तियों के मूल डेटा पर कोड लागू करने का प्रयास किया, तो यह त्रुटि के साथ टूट जाता है कि लंबे वैक्टर अभी तक समर्थित नहीं हैं: –

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