如何用NA替换整行data.table?

use*_*975 5 r data.table

这似乎应该很容易,但我无法弄清楚.

>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,它也可以工作,但没有警告.但后来我需要转换回来,这似乎很尴尬.有没有更好的办法?

mne*_*nel 8

通过引用设置.

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)

  • 实际上,`DT [rownum,(姓名(DT)):=.SD [NA]]`很整洁!也许这比`set()`更好,想一想. (3认同)

Rol*_*and 7

使用显式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)

  • 这些将使用[< - 复制整个data.table (2认同)