简体   繁体   English

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

[英]In R, how to restrict selection and setting of cell values of data.table to list of columns?

I need to set all instances of "-1" in a subset of columns of a data.table to NA. 我需要将data.table的列子集中的所有“-1”实例设置为NA。

I can set all such instances of ALL columns in the data.table to NA as follows: 我可以将data.table中ALL列的所有此类实例设置为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

But how do I limit the replacement to a subset of columns, eg c("V2","V3")? 但是如何将替换限制为列的子集,例如c(“V2”,“V3”)? This doesn't work: 这不起作用:

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

We can loop through the index of names and set the elements that are -1 in those columns to NA. 我们可以循环遍历名称索引,并将这些列中-1的元素set为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

EDIT: Modified based on @Frank's comments. 编辑:根据@Frank的评论修改。

Here is a way without using a for loop: 这是一种不使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM