2016-07-29 21 views
1

Ich möchte ein statistisches Prozesskontrolldiagramm für jeden Namen in diesem Datenrahmen erstellen und die Zeilen extrahieren, die für jeden einzelnen Namen außer Kontrolle geraten.SPC - Kontrollkarten nach Gruppe in R

Unten ist der Datenrahmen:

DATE <- as.Date(c('2016-06-18', '2016-06-19', '2016-06-20', 
       '2016-06-21', '2016-06-22', '2016-06-23', 
       '2016-06-24', '2016-06-25', '2016-06-26', 
       '2016-06-27', '2016-06-28', '2016-06-29', 
       '2016-06-30', '2016-06-18', '2016-06-19', 
       '2016-06-20', '2016-06-21', '2016-06-22', 
       '2016-06-23', '2016-06-24', '2016-06-25', 
       '2016-06-26', '2016-06-27', '2016-06-28', 
       '2016-06-29', '2016-06-30', '2016-06-18', 
       '2016-06-19', '2016-06-20', '2016-06-21', 
       '2016-06-22', '2016-06-23', '2016-06-24', 
       '2016-06-25', '2016-06-26', '2016-06-27', 
       '2016-06-28', '2016-06-29', '2016-06-30')) 

Name <- c('A', 'A', 'A', 'A', 'A', 'A','A', 'A', 'A', 'A', 'A', 'A', 'A', 
      'B', 'B', 'B', 'B', 'B', 'B','B', 'B', 'B', 'B', 'B', 'B', 'B', 
      'C', 'C', 'C', 'C', 'C', 'C','C', 'C', 'C', 'C', 'C', 'C', 'C') 

Revenue <- c(0.08, 0.03, 0.09, 2, 0.09, 0.29, 0.56, 0.23, 0.12, 0.76, 0.23, 0.45,0.32, 
      0.10, 0.14, 0.80, 0.3, 0.12, 0.75, 0.20, 0.09, 0.22, 0.11, 4, 0.30, 0.45, 
      0.19, 0.23, 0.56, 0.77, 0.9, 9, 0.38, 0.11, 0.98, 0.87, 0.09, 0.20, 0.65) 
df<-data.frame(DATE, Name, Revenue) 

dput(df) 
structure(list(DATE = structure(c(16970, 16971, 16972, 16973, 
16974, 16975, 16976, 16977, 16978, 16979, 16980, 16981, 16982, 
16970, 16971, 16972, 16973, 16974, 16975, 16976, 16977, 16978, 
16979, 16980, 16981, 16982, 16970, 16971, 16972, 16973, 16974, 
16975, 16976, 16977, 16978, 16979, 16980, 16981, 16982), class = "Date"), 
Name = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), Revenue = c(0.08, 0.03, 0.09, 
2, 0.09, 0.29, 0.56, 0.23, 0.12, 0.76, 0.23, 0.45, 0.32, 
0.1, 0.14, 0.8, 0.3, 0.12, 0.75, 0.2, 0.09, 0.22, 0.11, 4, 
0.3, 0.45, 0.19, 0.23, 0.56, 0.77, 0.9, 9, 0.38, 0.11, 0.98, 
0.87, 0.09, 0.2, 0.65)), .Names = c("DATE", "Name", "Revenue"), 
row.names = c(NA, -39L), class = "data.frame") 

df 

> df 
     DATE Name Revenue 
1 2016-06-18 A 0.08 
2 2016-06-19 A 0.03 
3 2016-06-20 A 0.09 
4 2016-06-21 A 2.00 
5 2016-06-22 A 0.09 
6 2016-06-23 A 0.29 
7 2016-06-24 A 0.56 
8 2016-06-25 A 0.23 
9 2016-06-26 A 0.12 
10 2016-06-27 A 0.76 
11 2016-06-28 A 0.23 
12 2016-06-29 A 0.45 
13 2016-06-30 A 0.32 
14 2016-06-18 B 0.10 
15 2016-06-19 B 0.14 
16 2016-06-20 B 0.80 
17 2016-06-21 B 0.30 
18 2016-06-22 B 0.12 
19 2016-06-23 B 0.75 
20 2016-06-24 B 0.20 
21 2016-06-25 B 0.09 
22 2016-06-26 B 0.22 
23 2016-06-27 B 0.11 
24 2016-06-28 B 4.00 
25 2016-06-29 B 0.30 
26 2016-06-30 B 0.45 
27 2016-06-18 C 0.19 
28 2016-06-19 C 0.23 
29 2016-06-20 C 0.56 
30 2016-06-21 C 0.77 
31 2016-06-22 C 0.90 
32 2016-06-23 C 9.00 
33 2016-06-24 C 0.38 
34 2016-06-25 C 0.11 
35 2016-06-26 C 0.98 
36 2016-06-27 C 0.87 
37 2016-06-28 C 0.09 
38 2016-06-29 C 0.20 
39 2016-06-30 C 0.65 

Ich möchte ein Skript schreiben, die eine Kontrollkarte mit dem qcc Paket für jeden Namen und dann CallOut die Zeilen schaffen, die über die Grenzen sind für die Kontrollkarte jedes Namens.

So weiß ich, wie man eine normale individuelle Steuerkarte für jeden Namen getrennt, was das wäre. Name: "A" zum Beispiel:

Ergebnis:

enter image description here

Ergebnis ist ein Datenpunkt über die Grenzen nur für Namen sind A:

6 

Mein Ziel ist es, ein Skript zu schreiben, das die Zeilen für alle Namen extrahiert (nicht nur die Zeilennummer wie 6).

Also hier ist, was ich will die Ausgabe wie am Ende aussehen:

Out_of_Control_Rows_By_Name 
     DATE  Name Revenue 
    6 2016-06-21 A 2.00 
    11 2016-06-28 B 4.00 
    6 2016-06-23 C 9.00 

Jede Hilfe wäre toll, danke!

+0

In Zukunft wäre es, die Daten zu teilen mit 'dput' vorzuziehen sein, so dass es leicht Besonders in R. gelesen werden können, wenn Sie rownames haben, so dass es schwieriger macht, nimm Daten von deiner Frage und versuche, sie einzulesen. –

+0

willst du immer noch, dass ich es tue oder warst du in der Lage es in R zu lesen, so wie es ist? @ Hack-R –

+1

@ Hack-R hinzugefügt dput zum Datenrahmen. Hoffe, das macht es leichter zu verstehen. Vielen Dank! –

Antwort

2
require(pacman) # you don't have to use this; it's my package manager 
p_load(dplyr,qcc) 

tmp <- df[0,] 
for(i in unique(df$Name)){ 
    testing<-filter(df, Name == i) 
    my.xmr.x <- qcc(testing$Revenue, type = "xbar.one", plot=TRUE) 
    beyond.limits(my.xmr.x) 
    df2 <- df[df$Name == i,] 
    tmp <- rbind(tmp,df2[beyond.limits(my.xmr.x),]) 
} 
  DATE Name Revenue 
4 2016-06-21 A  2 
24 2016-06-28 B  4 
32 2016-06-23 C  9 
+0

Das funktioniert gut auf diesem Datensatz, aber nicht auf meinem größeren aus irgendeinem Grund. Ein Fehler kommt auf, jede Idee, was ich im Skript ändern muss, um den Fehler zu entfernen ?: Fehler in plot.window (...): brauche endlich 'Ylim' Werte –

+0

Ich denke, es hat mit fehlenden Werten zu tun, weil Mein aktueller Datensatz, ich alle Namen nicht alle zusammen an jedem DATE. So gibt es zum Beispiel ein paar Namen, die bei manchen Daten nicht vorkommen und NAs im Plot verursachen. –

+0

Geht einen Schritt weiter. Ich denke, dass das Problem sein kann, wenn es die Grenzen im Diagramm berechnet. Wegen der Zahlen gibt es NA-Werte aus, die es dem Diagramm nicht erlauben, Grenzen zu zeichnen/berechnen. Also muss ich einen Weg finden, dies ohne NA irgendwie zu schaffen. Entschuldigung für alle Kommentare. Danke @ Hack-R –