我想使用 R 从数据集中前 3 列的每个值中减去每个“空白”列的平均值,如下所示:
df<- data.frame(da = 1:5,
d2 = 6:10,
dd = 2:6,
blank...1 = c(0.1,0.1,0.4,0.2,0.1),
d5 = 2:6,
dg = 7:11,
di = 3:7,
blank...2 = c(0.2,0.2,0.4,0.1,0.1),
dm = 21:25,
h4 = 5:9,
d7 = 26:30,
blank...3 = c(0.1, 0.3, 0.4, 0.4, 0.1)
)
换句话说,我想将blank...1的平均值减去da、d2和dd列的每个值;然后将空白...2 的平均值减去 d5、dg 和 di 等列的每个值。实际数据集实际上有 15 个空白,需要从前面的 11 列中减去。
我已经使用 colMeans 生成了向量中所有“空白”列的平均值,但我不知道如何编写函数来指示哪个值用于哪些列。
如何通过 R 中的函数来实现这一点?
谢谢!
我确信有一个更优雅的解决方案,但在基本 R 中,您可以首先识别名称中带有“空白”的那些(
blnknms
),然后使用 lapply
迭代这些列并减去该列的平均值来自前三列:
# get columns with "blank" in the name
blnknms <- grep("blank", names(df))
df[,-blnknms] <- unlist(lapply(blnknms, \(x){
df[,(x-3):(x-1)] - mean(df[,x])
}), recursive = FALSE)
输出:
# da d2 dd blank...1 d5 dg di blank...2 dm h4 d7 blank...3
# 1 0.82 5.82 1.82 0.1 1.8 6.8 2.8 0.2 20.74 4.74 25.74 0.1
# 2 1.82 6.82 2.82 0.1 2.8 7.8 3.8 0.2 21.74 5.74 26.74 0.3
# 3 2.82 7.82 3.82 0.4 3.8 8.8 4.8 0.4 22.74 6.74 27.74 0.4
# 4 3.82 8.82 4.82 0.2 4.8 9.8 5.8 0.1 23.74 7.74 28.74 0.4
# 5 4.82 9.82 5.82 0.1 5.8 10.8 6.8 0.1 24.74 8.74 29.74 0.1
这是受 jpsmith 启发的另一种基本 R 方法:
blanks = grep("blank", names(df)) # find the blank columns
blank_means = colMeans(df[blanks]) # get their means
## subtract blanks means from the non-blank columns
## this relies on having exactly 3 non-blank columns per blank column
df[-blanks] = Map("-", df[-blanks], rep(blank_means, each = 3))
df
# da d2 dd blank...1 d5 dg di blank...2 dm h4 d7 blank...3
# 1 0.82 5.82 1.82 0.1 1.8 6.8 2.8 0.2 20.74 4.74 25.74 0.1
# 2 1.82 6.82 2.82 0.1 2.8 7.8 3.8 0.2 21.74 5.74 26.74 0.3
# 3 2.82 7.82 3.82 0.4 3.8 8.8 4.8 0.4 22.74 6.74 27.74 0.4
# 4 3.82 8.82 4.82 0.2 4.8 9.8 5.8 0.1 23.74 7.74 28.74 0.4
# 5 4.82 9.82 5.82 0.1 5.8 10.8 6.8 0.1 24.74 8.74 29.74 0.1