这似乎应该很容易,但我无法弄明白。
>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(整个表的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
如果我转换为data.frame,它也可以工作但没有警告。但后来我需要转换回来,这似乎很尴尬。还有更好的方法吗?
答案 0 :(得分:8)
通过引用设置。
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会创建一个大的子行组,这可能会稍快一些。
你也可以这样做(Roland解决方案的一个变种,但没有复制。
DT[rownum, (names(DT)) := .SD[NA]]
答案 1 :(得分:7)
使用明确的NA
类型:
d[3,] <- list(NA_integer_, NA_integer_, NA_character_)
另一种可能性:
d[3,] <- d[3,lapply(.SD,function(x) x[NA])]
答案 2 :(得分: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>
[来自Matthew]是set()
是要走的路,或@ mnel的答案非常简洁:
DT[rownum, names(DT) := .SD[NA]]
关于set
方法中是否存在强制警告,这里是内部代码(此处修改以传达显着点)。在写这篇文章时,我似乎已经失去了精确度(从double
到integer
),以及强迫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 no coerce warning if no precision lost
在这个问题上添加了一个链接。
一般情况下,data.table
在警告您潜在问题或效率低下时过于谨慎,在这种情况下,如果要设置一组不同类型的列,则使用suppressWarnings()
包装是另一个方式。
答案 3 :(得分: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))
}