首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R减去数个变量的均值和除以标准差

R减去数个变量的均值和除以标准差
EN

Stack Overflow用户
提问于 2017-04-06 21:41:44
回答 2查看 3.7K关注 0票数 2

我试图在dataframe中标准化某些列,而不是所有列。通过标准化,我的意思是,减去平均数,除以标准差。我的问题是,假设我处理的是这个data(mtcars)数据集,那么如何对列1、2、4和6中的值进行标准化。

我可以手动做到这一点,但我很好奇,知道是否有一个有效的方法来做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-06 21:59:37

scale为你做这件事。所以

代码语言:javascript
运行
复制
df<-mtcars
df[,c(1,2,4,6)]<-scale(df[,c(1,2,4,6)])

将保持其他变量不变。scale将mean作为属性返回,您可以使用它们来逆转流程。

票数 4
EN

Stack Overflow用户

发布于 2017-04-06 21:52:18

代码语言:javascript
运行
复制
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调用中以及在重新分配( <-=的左边)中对其进行子集。

代码语言:javascript
运行
复制
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(...))包装它,以便将它返回到原始类。

对多列进行单一修改的一种流行方法是形成一个logical向量(可能比整数更安全),例如这个过于简化的示例。向量的使用使随后的重新分配可以说更容易阅读。

代码语言:javascript
运行
复制
vec <- sapply(mt, function(x) min(x)>10)
mt[vec] <- lapply(mt[vec], `+`, mysd)

(如果整数的向量包含列数以下或以上的任何内容,则使用整数变得不那么可预测/健壮。它在integer(0)中工作得很好,所以如果需要的话可以随意使用。)

这样做的一个好的副作用是,如果函数是“昂贵的”(时间或资源),那么它只能在相关的列上运行。如果没有选择,就什么也不做。

代码语言:javascript
运行
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43266239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档