如何选择数据表中主键中缺少值的所有行.
DT = data.table(x=rep(c("a","b",NA),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)
Run Code Online (Sandbox Code Playgroud)
选择特定值很容易
DT["a",]
Run Code Online (Sandbox Code Playgroud)
选择缺失值似乎需要矢量搜索.一个人不能使用二进制搜索.我对么?
DT[NA,]# does not work
DT[is.na(x),] #does work
Run Code Online (Sandbox Code Playgroud) 这是我认为应该问这个问题的问题.我想在R-forge跟踪器中将其作为一个错误/不一致之前确认是否存在错误/不一致.
考虑一下data.table:
require(data.table)
DT <- data.table(x=c(1,0,NA), y=1:3)
Run Code Online (Sandbox Code Playgroud)
现在,要访问不是 0 的DT的所有行,我们可以通过以下方式执行:
DT[x != 0]
# x y
# 1: 1 1
DT[!(x == 0)]
# x y
# 1: 1 1
# 2: NA 3
Run Code Online (Sandbox Code Playgroud)
当基础逻辑操作等效时,访问DT[x != 0]并DT[!(x==0)]给出不同的结果.
注:转换到这一个data.frame和运行这些操作会给结果彼此两个逻辑上是等价的操作相同,但结果是不同的两种data.table结果.有关原因的解释,请?`[`参阅本节NAs in indexing.
编辑:由于你们中的一些人已经强调要求平等data.frame,这里是data.frame上相同操作的输出片段:
DF <- as.data.frame(DT)
# check ?`[` under the section `NAs in indexing` as to why this happens
DF[DF$x != 0, …Run Code Online (Sandbox Code Playgroud) 我有一个data.table,列有一个NAs.我想删除该列占用特定值的行(恰好是这样"").但是,我的第一次尝试也导致我丢失了NAs 行:
> a = c(1,"",NA)
> x <- data.table(a);x
a
1: 1
2:
3: NA
> y <- x[a!=""];y
a
1: 1
Run Code Online (Sandbox Code Playgroud)
看了之后?`!=`,我找到了一个有效的衬垫,但这很痛苦:
> z <- x[!sapply(a,function(x)identical(x,""))]; z
a
1: 1
2: NA
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来做到这一点?此外,我认为没有好的方法来扩展它以排除多个非NA值.这是一个糟糕的方式:
> drop_these <- function(these,where){
+ argh <- !sapply(where,
+ function(x)unlist(lapply(as.list(these),function(this)identical(x,this)))
+ )
+ if (is.matrix(argh)){argh <- apply(argh,2,all)}
+ return(argh)
+ }
> x[drop_these("",a)]
a
1: 1
2: NA
> x[drop_these(c(1,""),a)]
a
1: NA
Run Code Online (Sandbox Code Playgroud)
我查看?J …
在这篇维基百科文章SQL join之后,我希望能够清楚地了解如何与data.table建立联接.在这个过程中,我们可能在加入NAs时发现了一个错误.以wiki为例:
R) X = data.table(name=c("Raf","Jon","Ste","Rob","Smi","Joh"),depID=c(31,33,33,34,34,NA),key="depID")
R) Y = data.table(depID=c(31,33,34,35),depName=c("Sal","Eng","Cle","Mar"),key="depID")
R) X
name depID
1: Joh NA
2: Raf 31
3: Jon 33
4: Ste 33
5: Rob 34
6: Smi 34
R) Y
depID depName
1: 31 Sal
2: 33 Eng
3: 34 Cle
4: 35 Mar
Run Code Online (Sandbox Code Playgroud)
LEFT OUTER JOIN
R) merge.data.frame(X,Y,all.x=TRUE)
depID name depName
1 31 Raf Sal
2 33 Jon Eng
3 33 Ste Eng
4 34 Rob Cle
5 34 Smi Cle
6 NA …Run Code Online (Sandbox Code Playgroud) 在检查了data.table 1.9.2的新功能之后,我不太清楚操作NA/NaN/Inf的新功能.
新闻:
NA,NaN,+ Inf和-Inf现在被认为是不同的值,可以是键,可以加入并可以分组.data.table定义:NA <NaN <-Inf
我不知道"可以加入并可以分组"是什么意思
DT <- data.table(A=c(NA,NA,1:3), B=c("a",NA,letters[1:3]))
Run Code Online (Sandbox Code Playgroud)
现在我们在A列和B列都有NA,
但我失去了一些如何继续,这个新功能的目的是什么.你能提供一个例子来说明这一点吗?
非常感谢!