data.table/data.frame rbind не работает нормально

Я использую data.table 1.9.6. Вот простой код и вывод:

df <- data.table(a=c(NA,NA,2,2),b=c(1,1,2,2))
nrow(df[is.na(a)]) + nrow(df[!is.na(a)])
# [1] 4
nrow(rbind(df[is.na(a)],df[!is.na(a)]))
# [1] 4
nrow(rbind(df[is.na(a),b := a],df[!is.na(a)]))
# [1] 6
rbind(df[is.na(a),b := a],df[!is.na(a)])
#     a  b
# 1: NA NA
# 2: NA NA
# 3:  2  2
# 4:  2  2
# 5:  2  2
# 6:  2  2
rbind(df[is.na(a),a := b],df[!is.na(a)])
#     a  b
# 1: NA NA
# 2: NA NA
# 3:  2  2
# 4:  2  2
# 5:  2  2
# 6:  2  2

по сути, просто rbind после is.na() и !is.na() дает мне хорошие результаты, но как только я пытаюсь заменить значения NA в столбце другим значением столбца rbind(df[is.na(a),a := b],df[!is.na(a)]), что-то ломается. Весьма нелогично rbind(df[is.na(a),b := a],df[!is.na(a)]) и ломается. Может ли кто-нибудь объяснить, что мне не хватает, или это ошибка?

Далее, чтобы все двигалось, я пробовал:

rbind(data.frame(df[is.na(a),a := b]),data.frame(df[!is.na(a)]))
#    a  b
# 1 NA NA
# 2 NA NA
# 3  2  2
# 4  2  2
# 5  2  2
# 6  2  2

Так что это не работает даже после того, как я конвертирую его в data.frame.


person abhiieor    schedule 22.09.2016    source источник
comment
dt[condition, col := blah] возвращает весь (теперь измененный) data.table dt. Вот почему вы получаете то, что получаете.   -  person eddi    schedule 22.09.2016


Ответы (1)


Проблема в том, что вы используете :=, который обновляется на месте с условием, но возвращает весь набор данных, игнорируя условие.

Либо используйте этот синтаксис, чтобы не обновлять на месте:

rbind(df[is.na(a),.(a,b = a)],df[!is.na(a)])
    a  b
1: NA NA
2: NA NA
3:  2  2
4:  2  2

Или это только для обновления на месте

df[is.na(a),b := a]
df
    a  b
1: NA NA
2: NA NA
3:  2  2
4:  2  2
person HubertL    schedule 22.09.2016
comment
Я бы пошел с rbind(df[is.na(a)][, b := a], df[!is.na(a)]) - person eddi; 22.09.2016