在 R 中,如何将 data.table 的单元格值的选择和设置限制为列列表?
In R, how to restrict selection and setting of cell values of data.table to list of columns?
我需要将 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
但是如何将替换限制为列的子集,例如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
我们可以遍历名称索引和set
那些列中为-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
我需要将 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
但是如何将替换限制为列的子集,例如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
我们可以遍历名称索引和set
那些列中为-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