data.table / data.frame rbind不能正常工作

时间:2016-09-22 18:57:59

标签: r dataframe data.table 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值替换为其他列值{{1}时某事打破了。相反,不合逻辑的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 ,这也无效。

1 个答案:

答案 0 :(得分: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