2016-07-06 2 views
4

Как бы вы заменили все значения в data.table с условием?Заменить все значения в таблице данных. С условием

Например

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 

Я хочу, чтобы заменить все "6" по Н.А.

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 

Я пытался что-то вроде

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

, но он не работает, он производит гораздо более широкий стол.

+0

Возможно, вы должны использовать матрицу, если это то, что вам нужно делать. – Frank

ответ

8

Уроженец data.table способ сделать это было бы:

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 

Этот подход - хотя, возможно, более многословный - тем не менее будет значительно быстрее, чем ppp[ppp == 6] <- NA, поскольку он позволяет избежать копирования всех столбцов.

+0

Ницца. Любой способ написать это без явного для? – skan

+1

Необходимо перевернуть столбцы. – mtoto

+0

Что делать, если вместо одного номера (например, «6») у меня был вектор с разными номерами для разных столбцов ?. Например, я говорю, что столбцы c (2,5,6,9,11,111) должны быть сопоставлены с c (== 6, == 6,> 1,> 0, == 21, == 2) – skan

4

Еще проще:

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 

Важно отметить, что это не меняет свой класс:

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

Существует также 'is.na (ppp) <- ppp == 6' – Frank

+0

Спасибо. Я использовал это только вчера, но, похоже, вернулся к вредным привычкам. – lmo

+0

В любом случае, чтобы назначить NA из скобок ?. Когда я вижу примеры data.table, обычно все, что делается в скобках, выполняется с помощью data.table и быстрее, чем любая операция, выполняемая на улице, не так ли ?. – skan

Смежные вопросы