r 减去均值并除以几个变量的标准差
r subtract mean and divide by standard deviation on few variables
我正在尝试标准化数据框中的某些列,而不是所有列。我所说的标准化是指减去平均值并除以标准差。我的问题是我怎样才能对价值进行标准化
第 1、2、4 和 6 列假设我正在处理这个 data(mtcars)
数据集。
我可以手动执行此操作,但我很想知道是否有有效的方法来执行此操作。
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
中的 return 将是 list
,而不是 data.frame
。尽管它的行为通常完全相同,但您可以将其用 as.data.frame(lapply(...))
包装到 return 到原始 class.
对多列进行单个修改的一种流行方法是形成一个 logical
向量(可能比整数更安全),例如这个过度简化的示例。 vector 的使用使得后续的重新分配可以说更容易阅读。
vec <- sapply(mt, function(x) min(x)>10)
mt[vec] <- lapply(mt[vec], `+`, mysd)
(如果整数向量包含小于 1 或大于列数的任何值,则使用整数变得更少 predictable/robust。它适用于 integer(0)
,所以如果需要,请随意使用整数。 )
一个很好的副作用是,如果函数是 "expensive"(时间或资源),那么它只对相关列进行操作。如果未选择任何内容,则什么也不做。
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
为您做这件事。所以
df<-mtcars
df[,c(1,2,4,6)]<-scale(df[,c(1,2,4,6)])
将保持其他变量不变。 scale
returns 均值和标准差作为可用于反转过程的属性。
我正在尝试标准化数据框中的某些列,而不是所有列。我所说的标准化是指减去平均值并除以标准差。我的问题是我怎样才能对价值进行标准化
第 1、2、4 和 6 列假设我正在处理这个 data(mtcars)
数据集。
我可以手动执行此操作,但我很想知道是否有有效的方法来执行此操作。
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
中的 return 将是 list
,而不是 data.frame
。尽管它的行为通常完全相同,但您可以将其用 as.data.frame(lapply(...))
包装到 return 到原始 class.
对多列进行单个修改的一种流行方法是形成一个 logical
向量(可能比整数更安全),例如这个过度简化的示例。 vector 的使用使得后续的重新分配可以说更容易阅读。
vec <- sapply(mt, function(x) min(x)>10)
mt[vec] <- lapply(mt[vec], `+`, mysd)
(如果整数向量包含小于 1 或大于列数的任何值,则使用整数变得更少 predictable/robust。它适用于 integer(0)
,所以如果需要,请随意使用整数。 )
一个很好的副作用是,如果函数是 "expensive"(时间或资源),那么它只对相关列进行操作。如果未选择任何内容,则什么也不做。
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
为您做这件事。所以
df<-mtcars
df[,c(1,2,4,6)]<-scale(df[,c(1,2,4,6)])
将保持其他变量不变。 scale
returns 均值和标准差作为可用于反转过程的属性。