自动计算并命名数据集中每个变量的几个新版本

时间:2014-10-24 20:42:58

标签: r function for-loop

对于我的许多变量,在我可以运行简单的效果测试之前,我经常需要创建三个新版本(即,以平均为中心,以中心为中心加上一个标准偏差,以及中心减去一个标准偏差)。

我可以创建一个函数来计算每个新变量,但这并不会自动重命名变量,并且对于许多变量来说都是耗时且重复的。

# example data of test performance
d <- read.table(header=T, text='
 subject sex    math  read   sci
       1   M     7.9  12.3  10.7
       2   F     6.3  10.6  11.1
       3   F     9.5  13.1  13.8
       4   M    11.5  13.4  12.9
')

# function to create mean-centered version of variable
mc <- function(x) {
    x - mean(x, na.rm=T)
}
d$readMC <- mc(d$read)

# function to create mc version minus 1 SD
msd <- function(x) {
    x - sd(x, na.rm=T)
}
d$readMCmsd <- msd(d$read_mc)

# function to create mc version plus 1 SD
psd <- function(x) {
    x + sd(x, na.rm=T)
}
d$readMCpsd <-psd(d$read_mc)

对于像上面这样的数据集,如何编写单个函数或for循环来计算,重命名和添加到我的数据集中的三个新版本的变量math,read和sci?

提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:1)

您的功能可能类似

foo <- function(x, ...) {
    MC <- x - mean(x, ...)
    SD <- sd(MC, ...)
    data.frame(MC = MC, MCmsd = MC - SD, MCpsd = MC + SD)
}

然后使用math

scireadlapply列上运行它
lapply(d[-(1:2)], foo, na.rm = TRUE)
# $math
#     MC      MCmsd      MCpsd
# 1 -0.9 -3.1241103  1.3241103
# 2 -2.5 -4.7241103 -0.2758897
# 3  0.7 -1.5241103  2.9241103
# 4  2.7  0.4758897  4.9241103
# 
# $read
#      MC      MCmsd      MCpsd
# 1 -0.05 -1.3056539  1.2056539
# 2 -1.75 -3.0056539 -0.4943461
# 3  0.75 -0.5056539  2.0056539
# 4  1.05 -0.2056539  2.3056539
# 
# $sci
#       MC      MCmsd      MCpsd
# 1 -1.425 -2.8955441 0.04554412
# 2 -1.025 -2.4955441 0.44554412
# 3  1.675  0.2044559 3.14554412
# 4  0.775 -0.6955441 2.24554412