2016-07-06 11 views
4

Wie würden Sie bei einer Bedingung alle Werte in einer data.table ersetzen?Ersetzen Sie alle Werte in einer data.table bei einer Bedingung

Zum Beispiel

ppp <- data.table(A=1:6,B=6:1,C=1:6,D=3:8) 

A B C D 
1 6 1 3 
2 5 2 4 
3 4 3 5 
4 3 4 6 
5 2 5 7 
6 1 6 8 

Ich möchte alle "6" von NA

A B C D 
1 NA 1 3 
2 5 2 4 
3 4 3 5 
4 3 4 NA 
5 2 5 7 
NA 1 6 8 

ersetzen Ich habe versucht, so etwas wie

ppp[,ifelse(.SD==6,NA,.SD)] 

aber es funktioniert nicht, es produziert einen viel breiteren Tisch.

+0

Sie sollten wahrscheinlich eine Matrix verwenden, wenn dies die Art von Sache ist, die Sie tun müssen. – Frank

Antwort

8

gebürtige data.table Weg, dies zu tun wäre:

for(col in names(ppp)) set(ppp, i=which(ppp[[col]]==6), j=col, value=NA) 
# Test 
> ppp 
    A B C D 
1: 1 NA 1 3 
2: 2 5 2 4 
3: 3 4 3 5 
4: 4 3 4 NA 
5: 5 2 5 7 
6: NA 1 NA 8 

Dieser Ansatz - obwohl vielleicht ausführlicher - wird jedoch deutlich schneller sein als ppp[ppp == 6] <- NA, weil es das Kopieren aller Spalten vermeidet.

+0

Schön. Irgendeine Möglichkeit, es ohne explizites zu schreiben? – skan

+1

Es ist notwendig, die Spalten zu durchlaufen. – mtoto

+0

Was wäre, wenn statt einer einzigen Zahl (wie "6") ich einen Vektor mit verschiedenen Zahlen für verschiedene Spalten hätte ?. Zum Beispiel sage ich Spalten c (2,5,6,9,11,111) muss gegen c verglichen werden (== 6, == 6,> 1,> 0, == 21, == 2) – skan

4

Noch einfacher:

ppp[ppp == 6] <- NA 

ppp 
    A B C D 
1: 1 NA 1 3 
2: 2 5 2 4 
3: 3 4 3 5 
4: 4 3 4 NA 
5: 5 2 5 7 
6: NA 1 NA 8 

Wichtig ist, dass sich das nicht ändert seine Klasse:

is.data.table(ppp) 
[1] TRUE 
+2

Es gibt auch 'is.na (ppp) <- ppp == 6' – Frank

+0

Danke. Ich habe das erst gestern benutzt, aber es scheint sich in schlechte Gewohnheiten zurückzuziehen. – lmo

+0

Wie auch immer die NA von innerhalb der Klammern? Wenn ich data.table Beispiele sehe, ist normalerweise alles, was innerhalb der eckigen Klammern gemacht wird, mit data.table erledigt und ist schneller als irgendeine Operation draußen, nicht wahr? – skan

Verwandte Themen