繁体   English   中英

在R中使用scale()进行z转换

[英]Using scale() for z transformation in R

这是我的数据框

time    value
1       118.8
2       118.2
3       116.7
4       115.3
5       114.4
.
.
.
1000    113.5
1       113.1
.
.
.
1000    112.1
1       112
.
.
.
1000    113

我使用df$value_z <- scale(df$value)对表中给定的所有数据点进行z转换。 这将创建一个具有z转换值的新行,效果很好。

但是,数据实际上是大约50个数据源的串联。 对于每个来源,我都有1000个值。 因此,以我为例,更实际的做法是分别对一个来源中的所有值进行z转换。 50个块,每个1-1000。

因此,我需要调整命令df$value_z <- scale(df$value)使其不一起处理所有数据,而是对每1000行进行一次处理。

我怎么做?

谢谢!

# add a grouping variable
df$group = rep(1:50, each = 1000) # assumes 50 blocks of 1000 rows

然后使用dplyrdata.table按组应用功能。 选择您喜欢的:

library(dplyr)
df = df %>% group_by(group) %>% mutate(value_z = scale(value))

library(data.table)
setDT(df)
df[, value_z := scale(value), by = group]

我们也可以使用基数R中的tapply ,但是它对您的数据有更多的假设,并且效率可能较低。 (如果尚未按group对数据进行排序,它将无法按书面形式工作,其他方法仍然可以使用。)

df$value_z = unlist(with(df, tapply(X = value, INDEX = group, FUN = scale)))

这是一个可重现的示例,显示了您在三种方式上均获得相同的结果:

set.seed(47)
df = data.frame(time = rep(1:5, 3), value = rnorm(15))

df$group = rep(1:3, each = 5)

library(dplyr)
df = df %>% group_by(group) %>% mutate(value_z_dplyr = scale(value))

library(data.table)
setDT(df)
df[, value_z_dt := scale(value), by = group]

df$value_z_tapply = unlist(with(df, tapply(X = value, INDEX = group, FUN = scale)))

df
#     time       value group value_z_dplyr value_z_dt value_z_tapply
#  1:    1  1.99469634     1     1.6397422  1.6397422      1.6397422
#  2:    2  0.71114251     1     0.1892725  0.1892725      0.1892725
#  3:    3  0.18540528     1    -0.4048326 -0.4048326     -0.4048326
#  4:    4 -0.28176501     1    -0.9327546 -0.9327546     -0.9327546
#  5:    5  0.10877555     1    -0.4914274 -0.4914274     -0.4914274
#  6:    1 -1.08573747     2    -0.5379979 -0.5379979     -0.5379979
#  7:    2 -0.98548216     2    -0.3750263 -0.3750263     -0.3750263
#  8:    3  0.01513086     2     1.2515355  1.2515355      1.2515355
#  9:    4 -0.25204590     2     0.8172223  0.8172223      0.8172223
# 10:    5 -1.46575030     2    -1.1557336 -1.1557336     -1.1557336
# 11:    1 -0.92245624     3    -0.5283725 -0.5283725     -0.5283725
# 12:    2  0.03960243     3     0.4938015  0.4938015      0.4938015
# 13:    3  0.49382018     3     0.9764016  0.9764016      0.9764016
# 14:    4 -1.82822917     3    -1.4907437 -1.4907437     -1.4907437
# 15:    5  0.09147291     3     0.5489132  0.5489132      0.5489132

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM