5

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

>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

现在,我决定第 3 行是坏数据。我希望所有这些都设置为 NA。

d[3,]<-NA

警告消息:在[<-.data.table( *tmp*, 3, , value = NA) 中:将“逻辑”RHS 强制为“字符”以匹配列的类型。首先将目标列更改为“逻辑”(通过创建一个新的“逻辑”向量长度 5(整个表的 n 行)并分配它;即“替换”列),或者将 RHS 强制为“字符”(例如 1L、NA_ [real|integer]_, as.*, etc) 以使您的意图清晰并加快速度。或者,请在创建表格时预先正确设置列类型并坚持下去。

然而,它似乎奏效了。

> d
    x  y  z
1:  1 11  a
2:  2 12  b
3: NA NA NA
4:  4 14  d
5:  5 15  e

如果我转换为 data.frame,它也可以工作,但没有警告。但后来我需要转换回来,这似乎很尴尬。有没有更好的办法?

4

4 回答 4

9

参照设定。

DT[rownum, (names(DT)) := lapply(.SD, function(x) {  .x <- x[1]; is.na(.x) <- 1L; .x})]

也许

DT[rownum, (names(DT)) := lapply(.SD[1,], function(x) { is.na(x) <- 1L; x})]

这将确保创建正确的 NA 类型(以及因子和日期)

第二种情况只索引一次,如果 DT 中有很多列或 rownum 创建大量行子组,这可能会稍微快一些。

您也可以这样做(罗兰解决方案的一个变体,但没有复制。

DT[rownum, (names(DT)) := .SD[NA]]
于 2013-03-21T20:50:58.627 回答
7

使用显式NA类型:

d[3,] <- list(NA_integer_, NA_integer_, NA_character_)

另一种可能:

d[3,] <- d[3,lapply(.SD,function(x) x[NA])]
于 2013-03-21T17:44:15.727 回答
3

怎么用?set

> d=data.table(x=1:5,y=11:15,z=letters[1:5])
> set(d, 3L, 1:3, NA_character_)
> d
    x  y  z
1:  1 11  a
2:  2 12  b
3: NA NA NA
4:  4 14  d
5:  5 15  e
> str(d)
Classes ‘data.table’ and 'data.frame':  5 obs. of  3 variables:
 $ x: int  1 2 NA 4 5
 $ y: int  11 12 NA 14 15
 $ z: chr  "a" "b" NA "d" ...
 - attr(*, ".internal.selfref")=<externalptr> 

或者,简单地说:

> d=data.table(x=1:5,y=11:15,z=letters[1:5])
> d[3] <- NA_character_
> str(d)
Classes ‘data.table’ and 'data.frame':  5 obs. of  3 variables:
 $ x: int  1 2 NA 4 5
 $ y: int  11 12 NA 14 15
 $ z: chr  "a" "b" NA "d" ...
 - attr(*, ".internal.selfref")=<externalptr> 

[来自马修]是的,要么set()是要走的路,要么@mnel的回答非常简洁:

DT[rownum, names(DT) := .SD[NA]]

关于该set方法中是否存在强制警告,这是内部代码(此处已修改以传达要点)。在写这篇文章时,我似乎已经考虑到精度(从doubleinteger)的损失,以及强制 RHS 的效率低下。

if( (isReal(RHS) && (TYPEOF(targetcol)==INTSXP || isLogical(targetcol))) ||
    (TYPEOF(RHS)==INTSXP && isLogical(targetcol)) ||
    (isString(targetcol))) {
    if (isReal(RHS)) s3="; may have truncated precision"; else s3="";
    warning("Coerced '%s' RHS to '%s' to match the column's type%s. ... <s3> ...
}

可以在这里检查 assign.c 的完整来源:
https ://r-forge.r-project.org/scm/viewvc.php/pkg/src/assign.c?view=markup&root=datatable

有一个非常相似的功能请求来改进这一点:

FR#2551 Singleton := 如果没有精度丢失,RHS 没有强制警告

已在此处添加了指向此问题的链接。

一般来说,data.table在警告您潜在问题或效率低下时过于谨慎,在这种情况下,您想要设置一组不同类型的列,换行suppressWarnings()是另一种方式。

于 2013-03-21T17:45:16.270 回答
0

这就是我现在正在做的事情。好吧,我猜,但还是有点尴尬。

na_datatable_row<-function(dtrow){
  #take a row of data.table and return a row of the same table but 
  #with all values set tp NA
  #DT[rownum,]<-NA works but throws an annoying warning 
  #so instead, do DT[rownum,]<-na_datatable_row(DT[anyrow,]) 
  #this preserves the right types
  row=data.frame(dtrow)
  row[1,]<-NA
  return(data.table(row))
}
于 2013-03-21T17:56:57.997 回答