2016-09-22 22 views
3

我正在使用data.table 1.9.6。下面是一些簡單的代碼和輸出:data.table/data.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()給我優秀成果,但只要我嘗試在列與其他列值rbind(df[is.na(a),a := b],df[!is.na(a)])東西壞了更換NA值。相當不合邏輯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

'dt的[條件,西:=等等]'返回整個(現在修改)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