データフレーム内の特定の列を標準化しようとしています。標準化することは、平均を減算し、標準偏差で割ることを意味する。私の質問は、このdata(mtcars)
データセットを扱っていると仮定して、 列1,2,4、および6の値に対してこの標準化を行うにはどうすればよいですか。r平均を減算し、いくつかの変数で標準偏差で除算します。
私はこれを手動で行うことができますが、これを効率的に行う方法があるかどうかを知りたいと思っています。
データフレーム内の特定の列を標準化しようとしています。標準化することは、平均を減算し、標準偏差で割ることを意味する。私の質問は、このdata(mtcars)
データセットを扱っていると仮定して、 列1,2,4、および6の値に対してこの標準化を行うにはどうすればよいですか。r平均を減算し、いくつかの変数で標準偏差で除算します。
私はこれを手動で行うことができますが、これを効率的に行う方法があるかどうかを知りたいと思っています。
scale
これはあなたのためです。したがって
df<-mtcars
df[,c(1,2,4,6)]<-scale(df[,c(1,2,4,6)])
は、他の変数を変更しません。 scale
は、プロセスを逆にするために使用できる属性としてmeanとsdを返します。
mt <- mtcars
str(mt)
# 'data.frame': 32 obs. of 11 variables:
# $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
# $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
# $ disp: num 160 160 108 258 360 ...
# $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
# $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
# $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
# $ qsec: num 16.5 17 18.6 19.4 17 ...
# $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
# $ am : num 1 1 1 0 0 0 0 0 0 0 ...
# $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
# $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
トリック*apply
コールならびに(<-
又は=
の左側)再割り当ての両方をサブセットすることです。
mysd <- 3 # something important
mt[c(1,2,4,6)] <- lapply(mt[c(1,2,4,6)], `+`, mysd)
str(mt)
# 'data.frame': 32 obs. of 11 variables:
# $ mpg : num 24 24 25.8 24.4 21.7 21.1 17.3 27.4 25.8 22.2 ...
# $ cyl : num 9 9 7 9 11 9 11 7 7 9 ...
# $ disp: num 160 160 108 258 360 ...
# $ hp : num 113 113 96 113 178 108 248 65 98 126 ...
# $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
# $ wt : num 5.62 5.88 5.32 6.21 6.44 ...
# $ qsec: num 16.5 17 18.6 19.4 17 ...
# $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
# $ am : num 1 1 1 0 0 0 0 0 0 0 ...
# $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
# $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
lapply
からの戻りがlist
されることに注意してください、ではないdata.frame
。多くの場合、その動作は十分に同一ですが、as.data.frame(lapply(...))
でラップして元のクラスに戻すことができます。
複数の列に対して1回の変更を行う一般的な方法は、この単純化された例のようにベクトル(整数よりも安全かもしれません)を形成することです。ベクトルを使用することにより、その後の再割り当てはおそらく読みやすくなります。
vec <- sapply(mt, function(x) min(x)>10)
mt[vec] <- lapply(mt[vec], `+`, mysd)
(整数を使用すると、整数のベクトルが1以下または列の数以上のものが含まれている場合、それは、integer(0)
で正常に動作します。堅牢/予測しにくいとなり、必要に応じてint型を使用して自由に感じる。)
これの良い副作用の1つは、関数が "高価"(時間またはリソース)の場合、関連する列でのみ機能することです。何も選択されていない場合、何も行われません。
vec <- sapply(mt, function(x) min(x) > 300)
any(vec)
# [1] FALSE
system.time(mt[vec] <- lapply(mt[vec], function(x) { Sys.sleep(100); x+1; }))
# user system elapsed
# 0 0 0
「スケール」はこれを行います。だからあなたは 'scale(mtcars [、c(1,2,4,6)]')を行うことができます。プロセスを逆にするために使用できる属性としてスケーリングパラメータを返します。 –
@AndrewGustar、良い提案ですが、私は他の変数、3,5などを失います...私はこのプロセス中に変数を失いたくありません。 –
'df <-mtcars'' df [、c(1,2,4,6)] < - scale(df [、c(1,2,4,6)])'は他の変数を変更しません。 –