用一个值替换R data.table中所有缺失的值

用一个值替换R data.table中所有缺失的值,r,data.table,R,Data.table,如果R data.table缺少值,如何用值0替换所有值?例如 aa = data.table(V1=1:10,V2=c(1,2,2,3,3,3,4,4,4,4)) bb = data.table(V1=3:6,X=letters[1:4]) setkey(aa,V1) setkey(bb,V1) tt = bb[aa] V1 X V2 1: 1 NA 1 2: 2 NA 2 3: 3 a 2 4: 4 b 3 5: 5 c 3 6: 6 d

如果R data.table缺少值,如何用值0替换所有值?例如

aa = data.table(V1=1:10,V2=c(1,2,2,3,3,3,4,4,4,4))
bb = data.table(V1=3:6,X=letters[1:4])
setkey(aa,V1)
setkey(bb,V1)
tt = bb[aa]

    V1  X V2
 1:  1 NA  1
 2:  2 NA  2
 3:  3  a  2
 4:  4  b  3
 5:  5  c  3
 6:  6  d  3
 7:  7 NA  4
 8:  8 NA  4
 9:  9 NA  4
10: 10 NA  4
有没有办法在一条线上完成?如果它只是一个矩阵,您可以:

tt[is.na(tt)] = 0
这里没什么不寻常的:

tt[is.na(tt)] = 0
…会有用的

然而,鉴于以下情况,这有点令人困惑:

tt[is.na(tt)]
…目前返回:

[.data.table
(tt,is.na(tt))中出错:i是无效类型 (矩阵)。也许将来一个2列矩阵可以返回 DT的元素(本着常见问题2.14中A[B]的精神)。请让 datatable可帮助您了解是否需要此功能,或将您的评论添加到FR#1611

is.na
(作为一个原语)的开销相对较小,而且通常速度相当快。因此,您可以在列中循环,并使用
set
na替换为
0`


使用
我将使用
数据表和
lappy,即:

tt[,lapply(.SD,function(kkk) ifelse(is.na(kkk),-666,kkk)),.SDcols=names(tt)]
屈服于:

V1    X V2
 1:  1 -666  1
 2:  2 -666  2
 3:  3    a  2
 4:  4    b  3
 5:  5    c  3
 6:  6    d  3
 7:  7 -666  4
 8:  8 -666  4
 9:  9 -666  4
10: 10 -666  4

OP发布的具体问题也可以通过以下方式解决:

tt[is.na(X), X := 0]

tt[is.na(tt)]=0
适合我。你是对的,我不知道我在找什么。请随便回答,我会接受的。+1是个好问题。但是你选择的答案不是惯用的方式。我建议你重新考虑。想想我希望这是怎么回事,
tt[is.na(tt),.SD:=0]
来看看mind@eddi,嗯,这看起来很好,可能也不难实现……我会想一想。是的,我想发生的事情是,我尝试了它,但出现了错误,并且感到困惑,没有想到直接尝试将其设置为零。谢谢!这不是惯用的方法,因为这会复制所有列。太好了.当我看到那个错误时,我停止了。谁知道分配之后会起作用…我收集到这是因为在尝试进行选择时调用了data.table特定代码,但在执行替换操作时使用了general data.frame代码。令人困惑,但这是一个特别边缘的示例。答案很好。不是严格要求,但任何在不使用for循环的情况下执行此操作,例如使用lappy?或者这是否也会复制列?无论我是否使用
traceem(tt),我都无法接近您看到的时间增长
在每次运行之前,各自的运行时间大约为0.34和0.42。
@最近的邮件,我刚刚再次检查。它是0.386 vs 5.05秒。在运行system.time之前,您是否再次生成tt?第一个通过引用修改它……我一直使用
tt2,这非常慢,因为
ifelse()
更新所有值。使用,它比使用
set()的循环慢15倍。
V1    X V2
 1:  1 -666  1
 2:  2 -666  2
 3:  3    a  2
 4:  4    b  3
 5:  5    c  3
 6:  6    d  3
 7:  7 -666  4
 8:  8 -666  4
 9:  9 -666  4
10: 10 -666  4
tt[is.na(X), X := 0]