2017-04-06 114 views
0

我正在尝试标准化数据框中的某些列,而不是所有列。通过标准化我的意思是,减去平均值并除以标准偏差。我的问题是,如何处理这个data(mtcars)数据集,我如何才能在第1,2,4和6列中仅对 中的值进行标准化。r减去平均值并除以几个变量的标准偏差

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

+0

'scale'为你做到这一点。所以你可以做'scale(mtcars [,c(1,2,4,6)])''。它将缩放参数作为可用于反转该过程的属性返回。 –

+0

@ArewrewGustar,很好的建议,但我失去了其他变量,3,5等...我不想在这个过程中失去任何变数。 –

+0

'df <-mtcars''df [,c(1,2,4,6)] < - scale(df [,c(1,2,4,6)])'将使其他变量保持不变 –

回答

1

scale为您做到这一点。所以

df<-mtcars 
df[,c(1,2,4,6)]<-scale(df[,c(1,2,4,6)]) 

将保持其他变量不变。 scale返回平均值和sd作为可用于反转进程的属性。

0
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(...))包装它以将其返回到原始类。

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

vec <- sapply(mt, function(x) min(x)>10) 
mt[vec] <- lapply(mt[vec], `+`, mysd) 

(使用整数变得更不可预测/健壮如果整数的向量包括低于1或高于列数任何事情。它正常工作与integer(0),因此,如果期望的随意使用整数。)

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

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 
相关问题