对于我的许多变量,在我可以运行简单的效果测试之前,我经常需要创建三个新版本(即,以平均为中心,以中心为中心加上一个标准偏差,以及中心减去一个标准偏差)。
我可以创建一个函数来计算每个新变量,但这并不会自动重命名变量,并且对于许多变量来说都是耗时且重复的。
# 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?
提前感谢您的任何帮助。
答案 0 :(得分:1)
您的功能可能类似
foo <- function(x, ...) {
MC <- x - mean(x, ...)
SD <- sd(MC, ...)
data.frame(MC = MC, MCmsd = MC - SD, MCpsd = MC + SD)
}
然后使用math
sci
,read
和lapply
列上运行它
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