2017-02-24 5 views
1

Ich erläutere meine Frage mit einem kleinen Datum Rahmen wie:Wie füge ich wiederholt Werte in Datenrahmenzeilen hinzu?

X1 X2 X3 
1 0 1 2 
2 0 1 3 
3 0 1 4 
4 0 2 3 
5 0 2 4 
6 0 3 4 
7 1 2 3 
8 1 2 4 
9 1 3 4 
10 2 3 4 

(Die wirkliche wird eine große Anzahl von Zeilen haben ...)
ich jede Zeile dieses Datenrahmens zu erweitern haben mit 12 zusätzlichen Werte, wenn man bedenken, dass die 3 Werte bereits die 3 Ausgangsbedingungen einer Reihe durch die Rekursionsgleichung definiert sind:

U(n) = U(n-1) - Min(U(n-2), U(n-3)) 

beispiel Betrachten der 1. r ow mit 0, 1, 2. Der nächste Term (4.) muss sein:

2 - Min(1, 0) = 2 - 0 = 2 

usw. Am Ende meiner ersten Reihe wird sein:

0 1 2 2 1 -1 -2 -1 1 3 4 3 0 -3 -3 

Und ich habe dies wiederholen Operation für jede Zeile meines ursprünglichen Datenrahmens. Natürlich weiß ich, dass ich komplizierte Schleifen "für {***}" verwenden kann, um dies zu tun, aber es ist zeitaufwendig.

Gibt es eine Möglichkeit, den endgültigen Datenrahmen Spalte für Spalte zu erstellen? (Ich meine nicht die Zeilen aufzulisten, sondern ganze Spalten basierend auf der Rekursionsgleichung)

Antwort

0

Sie müssen keine 'komplizierte Schleife' schreiben und Zeile für Zeile arbeiten. myfun

# recreate the sample dataframe 
data <- data.frame(x1 = c(rep(0, 6), 1,1,1,2), 
        X2 = c(1,1,1,2,2,4,2,2,3,3), 
        X3 = c(2,3,4,3,4,4,3,4,4,4)) 

# create placeholder dataframe full of zeros 
temp <- data.frame(matrix(data = 0, nrow = 10, ncol = 15)) 

# write the original dataframe into the placeholder dataframe 
temp[, 1:3] <- data 

# for columns 4 to 15 in the placeholder dataframe 
for(i in 4:15) 
{ 
     # calculate each column based on the given formula 
     temp[, i] <- temp[, i-1] - pmin(temp[,i-2], temp[, i-3]) 
} 
+0

Nun, es gibt ein Problem mit „min (Temp [i-2], Temperatur [, i-3]) ". Es berechnet die Min ** aller Werte ** der 2 Spalten temp [, i-2] und temp [, i-3] ... was nicht richtig ist. Das "min" ist auf die Werte einer Zeile zu berechnen. – Andrew

+0

@Andrew Ändern Sie einfach 'min' zu' pmin' und es sollte funktionieren – ira

+0

Natürlich! Entschuldigung für meinen Fehler ... Danke. – Andrew

0

Zeigen der Arbeit der rekursiven Funktion: Sie können nur eine einfache Schleife und berechnen Spalte für Spalte wie schreiben. In R, um eine rekursive Funktion zu erstellen Recall() wird in ihm angewendet. Für weitere Informationen über Recall() finden ?Recall

x <- c(0, 1, 2) 
len <- length(x) + 12 
myfun <- function(x, len) 
{ 
    n <- length(x) 
    print(x) 
    if(n < len) { 
    y <- (x[ n ] - min(x[ n - 1 ], x[ n - 2 ])) 
    x <- c(x, y) 
    Recall(x, len) 
    } else { 
    return(x) 
    } 
} 

myfun(x, len) 
# [1] 0 1 2 
# [1] 0 1 2 2 
# [1] 0 1 2 2 1 
# [1] 0 1 2 2 1 -1 
# [1] 0 1 2 2 1 -1 -2 
# [1] 0 1 2 2 1 -1 -2 -1 
# [1] 0 1 2 2 1 -1 -2 -1 1 
# [1] 0 1 2 2 1 -1 -2 -1 1 3 
# [1] 0 1 2 2 1 -1 -2 -1 1 3 4 
# [1] 0 1 2 2 1 -1 -2 -1 1 3 4 3 
# [1] 0 1 2 2 1 -1 -2 -1 1 3 4 3 0 
# [1] 0 1 2 2 1 -1 -2 -1 1 3 4 3 0 -3 
# [1] 0 1 2 2 1 -1 -2 -1 1 3 4 3 0 -3 -3 

Hinweis: print Befehl innerhalb myfun() Funktion entfernen und dann die folgenden Schritte aus.

Wenden Sie den Datenrahmen df1 auf die rekursive Funktion an.

result <- apply(df1, 1, function(x) { 
    len <- length(x) + 12 # you can change this number from 12 to any desired value. 
    myfun(x, len) 
    }) 

result <- t(result) # transpose results 
result 
#  X1 X2 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 
# [1,] 0 1 2 2 1 -1 -2 -1 1 3 4 3 0 -3 -3 
# [2,] 0 1 3 3 2 -1 -3 -2 1 4 6 5 1 -4 -5 
# [3,] 0 1 4 4 3 -1 -4 -3 1 5 8 7 2 -5 -7 
# [4,] 0 2 3 3 1 -2 -3 -1 2 5 6 4 -1 -5 -4 
# [5,] 0 2 4 4 2 -2 -4 -2 2 6 8 6 0 -6 -6 
# [6,] 0 3 4 4 1 -3 -4 -1 3 7 8 5 -2 -7 -5 
# [7,] 1 2 3 2 0 -2 -2 0 2 4 4 2 -2 -4 -2 
# [8,] 1 2 4 3 1 -2 -3 -1 2 5 6 4 -1 -5 -4 
# [9,] 1 3 4 3 0 -3 -3 0 3 6 6 3 -3 -6 -3 
# [10,] 2 3 4 2 -1 -3 -2 1 4 6 5 1 -4 -5 -1 

do.call('cbind', list(df1, result)) 
# X1 X2 X3 X1 X2 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 
# 1 0 1 2 0 1 2 2 1 -1 -2 -1 1 3 4 3 0 -3 -3 
# 2 0 1 3 0 1 3 3 2 -1 -3 -2 1 4 6 5 1 -4 -5 
# 3 0 1 4 0 1 4 4 3 -1 -4 -3 1 5 8 7 2 -5 -7 
# 4 0 2 3 0 2 3 3 1 -2 -3 -1 2 5 6 4 -1 -5 -4 
# 5 0 2 4 0 2 4 4 2 -2 -4 -2 2 6 8 6 0 -6 -6 
# 6 0 3 4 0 3 4 4 1 -3 -4 -1 3 7 8 5 -2 -7 -5 
# 7 1 2 3 1 2 3 2 0 -2 -2 0 2 4 4 2 -2 -4 -2 
# 8 1 2 4 1 2 4 3 1 -2 -3 -1 2 5 6 4 -1 -5 -4 
# 9 1 3 4 1 3 4 3 0 -3 -3 0 3 6 6 3 -3 -6 -3 
# 10 2 3 4 2 3 4 2 -1 -3 -2 1 4 6 5 1 -4 -5 -1 

ändern Spaltennamen colnames() Funktion

Daten:

df1 <- structure(list(X1 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 2L), 
         X2 = c(1L, 1L, 1L, 2L, 2L, 3L, 2L, 2L, 3L, 3L), 
         X3 = c(2L, 3L, 4L, 3L, 4L, 4L, 3L, 4L, 4L, 4L)), 
       .Names = c("X1", "X2", "X3"), 
       row.names = c(NA, -10L), 
       class = "data.frame") 
+0

Sie haben einen Fehler im Formelausdruck Ihrer Frage 'U (n) = U (n-1) - Min (U (n-2), U (n-3))'. Es sollte sein: U (n) = U (n) - Min (U (n-1), U (n-2)) – Sathish

+0

U (n) = U (n) ....? – Andrew

+0

Ich meinte, es ist kein Fehler in der Formel: Begriff des Rangs n wird durch die Bedingungen der Rang ** n-1 **, ** n-2 ** und ** n-3 ** gegeben. Deshalb hat deine Bemerkung mich verwirrt. Was die Antwort betrifft, ist es nicht so einfach wie _ira_, aber interessant. Vielen Dank. – Andrew

Verwandte Themen