2017-05-13 4 views
2

(Edited)Aktualisieren einen data.table in R

ich den folgenden Code verwenden, um zwei Spalten in einem data.table und aktualisieren Sie sie mit einigen Zahlen:

T <- data.table(Init_1 = rep(0, 100), Init_2 = rep(0, 100)) 

for (i in 1:100){ 
    T[, Init_1 := i] 
    T[, Init_2 := 2*i] 
} 

ich, dass dies erwartet Code würde der data.table T (Init_1 und Init_2) zwei Spalten hinzufügen und sie mit Zahlen füllen: (1: 100) bzw. (2,4, ... 200).

Allerdings gibt den Code konstante Werte:

 > T 
    Init_1 Init_2 
    1: 100 200 
    2: 100 200 
    3: 100 200 
    4: 100 200 
    5: 100 200 
    6: 100 200 
    7: 100 200 
    8: 100 200 
................. 

Können Sie sich erklären, warum mein Code nicht wie erwartet funktioniert und wie es behoben werden kann?

Ihr Rat wird geschätzt.


Edit:

In Bezug 2 zu beantworten, schließlich möchte ich für Schleife eine Funktion innerhalb der verwenden. Insbesondere:

# A FUNCTION THAT RETURNS THE TRANSITION PROBABILITIES AFTER N STEPS IN A MARKOV CHAIN 
#------------------------------------------------------------------------------------- 
R <- function(P, n){ 
    if (n==1) return(P) 
    R(P, n-1) %*% P 

} 

# A ONE-STEP PROBABILITY MATRIX 
#--------------------------------------------------------------------------------------- 
P = matrix(c(0.6, 0.1, 0.3, 0.2, 0.7, 0.1, 0.3, 0.3, 0.4), nrow = 3, byrow = TRUE) 

# EXAMINING THE CONVERGENCE PROCESS OF THE PROBABILITIES OVER TIME 
######################################################################### 
T <- data.table(Init_1 = rep(0, 100), Init_2 = rep(0, 100)) 

for (i in 1:100){ 
    T[, Init_1 := R(P, i)[1,1]] 
    T[, Init_2 := R(P, i)[2,1]] 
} 

oder

for (i in 1:100){ 
     T[, ':=' (Init_1 = R(P, i)[1,1], 
       Init_2 = R(P, i)[2,1]) ] 
    } 
+1

Sie keine Zeilen anstelle in data.table hinzufügen können, finden Sie [hier] (http://stackoverflow.com/questions/16792001/add-a-row-by-reference-at-the- Ende eines Datentabellenobjekts) –

+0

Was ist das: = für? – drbombe

+0

In data.table: = ermöglicht das Hinzufügen/Aktualisieren von Spalten. Z.B. DT [, c ("V1", "V2"): = Liste (Runde (exp (V1), 2), LETTER [4: 6])] (aus "Der offizielle Spickzettel für den DataCamp Kurs") – rf7

Antwort

1

Ich bin kein data.table Experte. Aber ich weiß, es wirft hilfreiche Fehlermeldungen. Wenn Sie z.B. eine leere data.table erstellen und versuchen zu verwenden: = Spalten hinzufügen, heißt es

T <- data.table() 
T[,a:=1] 
# Error in `[.data.table`(T, , `:=`(a, 1)) : 
# Cannot use := to add columns to a null data.table (no columns), currently. 
# You can use := to add (empty) columns to a 0-row data.table (1 or more empty columns), 
# though. 

Ihr Problem in Zusammenhang stehen könnte. Denn data.table(numeric()) bzw. T <- data.table(numeric(length = 0)) erstellt eine 0-zeilige data.table. Die leere Spalte erhält standardmäßig den Namen V1. Hier könnten Sie : = verwenden, um leere Spalten hinzuzufügen. Das ist jedoch nicht das, was Sie wollen.

Stattdessen könnten Sie

T <- data.table(numeric(0)) 
for (i in 1:5){ 
    T <- T[, .(
    Init_1=if (exists("Init_1")) c(Init_1, i) else i, 
    Init_2=if (exists("Init_2")) c(Init_2, 2*i) else 2*i)] 
} 
T 
# Init_1 Init_2 
# 1:  1  2 
# 2:  2  4 
# 3:  3  6 
# 4:  4  8 
# 5:  5  10 

tun Obwohl das ist ziemlich hässlich und wahrscheinlich Super unefficient.

0

Zuerst sollten Sie keine Funktion mit dem Namen T definieren. T ist in der Logik für TRUE reserviert. Auch ist es nicht empfehlenswert, i für Iteration zu verwenden, da es auch für komplexe Zahl verwendet wird, zum Beispiel

> (2i)^2 
[1] -4+0i 

Drittens Iteration in R. langsam sollten wir vermeiden Iteration zu verwenden, wann immer möglich.

Hier sind die einfachen Codes, um solche Matrix zu generieren. Hoffe das hilft.

T.data <- matrix(NA,nrow=100,ncol=2); 
T.data[,1] <- 1:100; 
T.data[,2] <- 2*T.data[,1] 
+1

OP arbeitet mit einer data.table und nicht mit einer Matrix. Auch Ihre ersten beiden Punkte sind höchstens eine Frage des Programmierstils.Die Verwendung von i als Iterator ist Standard und es gibt keinen Konflikt mit komplexen Zahlen, da der Parser ein einzelnes i von z. 1i. Wenn Sie die empfohlene Vorgehensweise entwickeln, logische Werte immer als TRUE und FALSE zu schreiben, gibt es auch kein Problem, T neu zu definieren. – Roland