2017-01-16 1 views
0

Ich richte eine "Entscheidungskarte" in xts ein. Das Ergebnis der folgenden Code erzeugt folgende:xts - Berechnung der Spalten intakt beibehalten, auch wenn einige Spalten fehlen

   dec.1 dec.2 dec.3 dec.4  Master.dec 
2017-01-01  2  2  2 2   2 
2017-02-02  3  3  3 3   3 
2017-03-03  0  0  0 0   0 

Es gibt immer mindestens existieren wird eine dieser Spalten (dec.1 -> Dec.4), aber es wird nicht bekannt sein, ob es 1,2,3 ist, oder 4 Spalten (Dez.1 -> Dez.4).

In der ursprünglichen Lösung werden die Entscheidungsspalten über das XTS-Sheet verteilt, so dass ich die Spaltennummer nicht als Bezeichner verwenden kann.

Frage:

In der Spalte "Master.dec" Ich rechne auf der Basis der linken Spalten (dec.1 - Dec.4), von denen es manchmal 1,2,3 sein wird, oder 4 Dezikonsäulen. Gibt es eine Möglichkeit, die Berechnung in "Master.dec" intakt und funktionsfähig zu halten, obwohl 1 bis 3 der Entscheidungsspalten nicht vorhanden wären?

das Problem zu reproduzieren Ich begegne:

1) führen Sie das komplette Skript

2) löschen eine Spalte: xts1 $ dec.1 < - NULL

3) laufen nur die Abschnitt 2 des Skripts (2.Add ein Regelsystem) ... erhalten Sie den Fehler:

Fehler in NextMethod (.Generic): dimmt [Produkt 3] stimmt nicht mit der Länge des Objekts überein [0]

Hinweis! Die Lösung sollte in der Lage sein, 1-3 Entscheidungsspalten zu entfernen, es wird immer eine Entscheidungsspalte geben, aber welche sind unbekannt.

# dependent libraries 
library(matrixStats) 
library(xts) 
############################################# 
# 1. Create the xts from a data.frame base 
############################################# 
# creates a dataframe 
df1 <- data.frame(date = c("2017-01-01", "2017-02-02", "2017-03-03"), 
       other.1 = c(1998, 1999, 2000), 
       dec.1 = c(2, 3, 0), 
       other.2 = c(58, 54, 32), 
       other.3 = c(12, 3, 27), 
       dec.2 = c(2, 3, 0), 
       dec.3 = c(2, 3, 0), 
       other.4 = c(2, 5, 27), 
       dec.4 = c(2, 3, 0) 
) 

# transforms the column date to date-format 
df1 = transform(df1,date=as.Date(as.character(date),format='%Y-%m-%d')) 
# creates the xts, based on the dataframe df1 
xts1 <- xts(df1[,-1],order.by = df1$date) 

############################################# 
# 2.Add a rule system: 
# if all "dec"-columns are 2, add value 2 in master.dec 
# if all "dec"-columns are 3, add value 3 in master.dec 
# if all "dec"-columns are 0, (or any other combination then above) add value 0 in master.dec 
############################################# 
xts1$m.dec <- ifelse(rowSds(xts1)==0,rowMins(xts1),0) 

Antwort

1

Da ein xts Objekt im Wesentlichen nur ein indiziertes matrix ist, könnten Sie versuchen, die zeilenweise Standardabweichung zu berechnen. Wenn das Ergebnis 0 ist (dh alle Werte sind gleich), dann weisen Sie Ihrer neuen Spalte rowMin (oder max, je nachdem, was Sie bevorzugen) zu, andernfalls 0. Mtoto, Ihr Vorschlag ist brillant -

library(matrixStats) 
xts1$m.dec <- ifelse(rowSds(xts1)==0,rowMins(xts1),0) 
#   dec.1 dec.2 dec.3 dec.4 m.dec 
#2017-01-01  2  2  2  2  2 
#2017-02-02  3  3  3  3  3 
#2017-03-03  0  0  0  0  0 
+0

:

Eine effiziente und präzise Lösung kann mit dem matrixStats Paket. Sehr klar, strukturiert und auf das, was ich brauche. Es ist eine sehr gute Basis. Was fehlt, ist: 1) Löschen einer dec.X-Spalte löst einen Fehler aus: xts1 $ dec.2 <- NULL: Fehler in NextMethod (.Generic): Dims [Produkt 3] stimmen nicht mit der Länge des Objekts [ 0]. 2) Die Möglichkeit, dec.X mit anderen Spalten dazwischen zu verteilen (wo es möglich wäre, dass diese Spalten tatsächlich eine 0/2/3 hätten, aber die matrixStats Funktion sollte nicht reagieren. (Nur am Dez.X – Toolbox

+0

ich bin nicht sicher, ich bekomme, was das Problem ist, können Sie immer die Spalten im Voraus angeben, 'xts1 [, cols]' – mtoto

+0

Ich werde den Code in dem Beispiel aktualisieren, um meine Kommentare zu klären. – Toolbox

Verwandte Themen