我正在使用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
,这也无效。
答案 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