重编码多变量的R解决方案

重编码多变量的R解决方案,r,dataframe,data.table,R,Dataframe,Data.table,如果类等于3,我想把变量‘a’、‘q’和‘t’设为零,把变量‘k’设为9 我的尝试 dataHAVE=data.frame("class"=c(1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3), "a"=c(0.96,0.65,0.62,0.8,0.17,0.26,0.41,0.41,0.33,0.73,0.26,0.09,0.06,0.69,0.36,0.76), "q"=c(0.2,0.24,0.45,0.43,

如果类等于3,我想把变量‘a’、‘q’和‘t’设为零,把变量‘k’设为9

我的尝试

dataHAVE=data.frame("class"=c(1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3),
                "a"=c(0.96,0.65,0.62,0.8,0.17,0.26,0.41,0.41,0.33,0.73,0.26,0.09,0.06,0.69,0.36,0.76),
                "q"=c(0.2,0.24,0.45,0.43,0.62,0.65,0.22,0.58,0.06,0.08,0.52,0.7,0.53,0.61,0.82,0.78),
                "t"=c(0.46,0.65,0.85,0.39,0.66,0.68,0.33,0.75,0.09,0.74,0.41,0.02,0.7,0.6,0.33,0.18),
                "k"=c(0.16,0.74,0.53,0.74,0.36,0.83,0.63,0.01,0.69,0.18,0.34,0.3,0.88,0.63,0.49,0.42))




dataWANT=data.frame("class"=c(1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3),
                    "a"=c(0.96,0.65,0.62,0.8,0.17,0.26,0.41,0.41,0.33,0.73,0,0,0,0,0,0),
                    "q"=c(0.2,0.24,0.45,0.43,0.62,0.65,0.22,0.58,0.06,0.08,0,0,0,0,0,0),
                    "t"=c(0.46,0.65,0.85,0.39,0.66,0.68,0.33,0.75,0.09,0.74,0,0,0,0,0,0),
                    "k"=c(0.16,0.74,0.53,0.74,0.36,0.83,0.63,0.01,0.69,0.18,9,9,9,9,9,9))

一个选项是
set

dataHAVE[class==3,c("a", "q", "t")] == 0
dataHAVE[class==3,c("k")] == 9
或者在
.SDcols
中指定它并使用
:=

library(data.table)
setDT(dataHAVE)
for(nm in c("a", "q", "t") set(dataHAVE,
           i = which(dataHAVE$class ==3), j = nm, value = 0)
dataHAVE[class ==3, k := 9]

一个选项是
set

dataHAVE[class==3,c("a", "q", "t")] == 0
dataHAVE[class==3,c("k")] == 9
或者在
.SDcols
中指定它并使用
:=

library(data.table)
setDT(dataHAVE)
for(nm in c("a", "q", "t") set(dataHAVE,
           i = which(dataHAVE$class ==3), j = nm, value = 0)
dataHAVE[class ==3, k := 9]

您可以使用
:=
通过引用更新值。您需要在左侧的
:=
上有一个名称向量,在右侧的列表上有一个值(如果有多个值)。以下任何一项都适用于您

dataHAVE[class == 3, names(dataHAVE)[-1] := 0 , .SDcols = names(dataHAVE[-1])][class ==3, k := 9][]


您可以使用
:=
通过引用更新值。您需要在左侧的
:=
上有一个名称向量,在右侧的列表上有一个值(如果有多个值)。以下任何一项都适用于您

dataHAVE[class == 3, names(dataHAVE)[-1] := 0 , .SDcols = names(dataHAVE[-1])][class ==3, k := 9][]


你是真的在用这个软件包,还是应该用它来代替标签?都可以,非常感谢!你是真的在用这个软件包,还是应该用它来代替标签?都可以,非常感谢!