这似乎应该很容易,但我无法弄清楚.
>d=data.table(x=1:5,y=11:15,z=letters[1:5])
>d
x y z
1: 1 11 a
2: 2 12 b
3: 3 13 c
4: 4 14 d
5: 5 15 e
Run Code Online (Sandbox Code Playgroud)
现在,我已经确定第3行是坏数据.我希望所有这些都设置为NA.
d[3,]<-NA
Run Code Online (Sandbox Code Playgroud)
警告消息:在
[<-.data.table(*tmp*,3,,value = NA)中:将"逻辑"RHS强制转换为"字符"以匹配列的类型.首先将目标列更改为"逻辑"(通过创建新的"逻辑"向量长度5(整个表的nrows)并分配;即"替换"列),或将RHS强制为"字符"(例如1L,NA_) [real | integer] _,as.*等)使你的意图清晰,速度快.或者,请在创建表格时正确设置列类型,并坚持使用.
然而,它似乎有效.
> d
x y z
1: 1 11 a
2: 2 12 b
3: NA NA NA
4: 4 14 d
5: 5 15 e
Run Code Online (Sandbox Code Playgroud)
如果我转换为data.frame,它也可以工作,但没有警告.但后来我需要转换回来,这似乎很尴尬.有没有更好的办法?
通过引用设置.
DT[rownum, (names(DT)) := lapply(.SD, function(x) { .x <- x[1]; is.na(.x) <- 1L; .x})]
Run Code Online (Sandbox Code Playgroud)
也许
DT[rownum, (names(DT)) := lapply(.SD[1,], function(x) { is.na(x) <- 1L; x})]
Run Code Online (Sandbox Code Playgroud)
这将确保创建正确的NA类型(因子和日期)
第二种情况只索引一次,如果DT中有很多列,或者rownum创建一个大的子行组,这可能会稍快一些.
你也可以这样做(Roland解决方案的一个变种,但没有复制.
DT[rownum, (names(DT)) := .SD[NA]]
Run Code Online (Sandbox Code Playgroud)
使用显式NA类型:
d[3,] <- list(NA_integer_, NA_integer_, NA_character_)
Run Code Online (Sandbox Code Playgroud)
另一种可能性
d[3,] <- d[3,lapply(.SD,function(x) x[NA])]
Run Code Online (Sandbox Code Playgroud)