2016-09-22 2 views
3

я пользуюсь данные.table 1.9.6. Вот некоторый простой код и выход:данные.table/данные.frame rbind не работает хорошо

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 

по существу только после rbindis.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.

+1

'дт [состояние, цв: = ло]' возвращает все (теперь изменено) 'data.table'' dt'. Вот почему вы получаете то, что получаете. – eddi

ответ

5

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

Либо использовать этот синтаксис не обновлять на месте:

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 
+3

Я бы пошел с 'rbind (df [is.na (a)] [, b: = a], df [! Is.na (a)])' – eddi

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