在R中,如何将data.table的单元格值的选择和设置限制为列列表?

在R中,如何将data.table的单元格值的选择和设置限制为列列表?,r,set,data.table,R,Set,Data.table,我需要将data.table的列子集中“-1”的所有实例设置为NA 我可以将data.table中所有列的所有此类实例设置为NA,如下所示: dt <- data.table(c("-1","A","A","B"), c("A","B","-1","-1"),c("-1","B","B","-1") ) for (i in seq_along(dt)) set(dt, i=which(dt[[i]]=="-1"), j=i, value=NA) > dt V1 V2

我需要将data.table的列子集中“-1”的所有实例设置为NA

我可以将data.table中所有列的所有此类实例设置为NA,如下所示:

dt <- data.table(c("-1","A","A","B"), c("A","B","-1","-1"),c("-1","B","B","-1") )
for (i in seq_along(dt)) 
    set(dt, i=which(dt[[i]]=="-1"), j=i, value=NA)
> dt
   V1 V2 V3
1: NA  A NA
2:  A  B  B
3:  A NA  B
4:  B NA NA
dt
V1 V2 V3
1:不,不,不
2:AB
3:A不适用B
4:B娜娜
但是,如何将替换限制为列的子集,例如c(“V2”、“V3”)? 这不起作用:

dt <- data.table(c("-1","A","A","B"), c("A","B","-1","-1"),c("-1","B","B","-1") )
for (i in seq_along(dt[,c("V2","V3"),with=FALSE])) 
    set(dt[,c("V2","V3"),with=FALSE], i=which(dt[,c("V2","V3"),with=FALSE][[i]]=="-1"), j=i, value=NA)
dt
> dt
V1 V2 V3
1: -1  A -1
2:  A  B  B
3:  A -1  B
4:  B -1 -1
dt
V1 V2 V3
1-1A-1
2:AB
3:A-1 B
4:B-1-1

我们可以循环遍历名称索引,并将这些列中的-1元素设置为NA

for(j in paste0('V', 2:3)){
 set(dt, i=which(dt[[j]]==-1), j=j, value=NA)
}

dt
#   V1 V2 V3
#1: -1  A NA
#2:  A  B  B
#3:  A NA  B
#4:  B NA NA

编辑:根据@Frank的评论进行修改。

以下是一种不使用
for
循环的方法:

dt <- data.table(c("-1","A","A","B"), c("A","B","-1","-1"), c("-1","B","B","-1") )

dt$V2 = ifelse(dt$V2 == "-1", NA, dt$V2)
dt$V3 = ifelse(dt$V3 == "-1", NA, dt$V3)

dt




   V1 V2 V3
1: -1  A NA
2:  A  B  B
3:  A NA  B
4:  B NA NA

dt这是可行的,但并没有真正利用data.table的引用赋值。每次分配时,例如,
dt$V2=…
都会重写data.table。确实避免了循环。@jlhoward是的,我觉得它不是很优雅,但我试图找到一种不使用臭名昭著的for循环的方法。我对这个软件包不太熟悉,但是如果有一种方法可以使用
apply
family函数进行赋值,那就最好了。