创建新的按顺序命名的变量并填充水平平均值

Create new sequentially named variables and fill with mean of level

警告:多部分问题!

我意识到其中的一部分已经在其他地方得到了解答,但我正在努力将它们整合到一个简洁的代码中....

我有一个数据框,其中包含许多 (24) 个感兴趣的数字列。对于每一列,我想在同一数据框中创建一个新变量(命名合理),其中的值对应于该变量的特定性别十分位数的平均值(性别在不同的列中,编码为 0/1) .

来自名为 'WBC' 的原始列的新列名称,例如:'WBC_meandec_women' 和 'WBC_meandeac_men'.

我已经尝试了各种代码来首先创建新变量,然后分配与十分位数相关的值,但是 none 效果很好,但无法弄清楚如何将它们组合在一起。我只知道有一种聪明的方法可以将所有部分放入同一个代码块中,我只是对 R 不够流利,无法到达那里...

dummydata <- data.frame(id=c(1:100),sex=rep(c(1,0),WBC=rnorm(100),RBC=rnorm(100))

正在努力实现:

goaldata <-        data.frame(id=c(1:100),sex=rep(c(1,0),50),WBC=rnorm(100),RBC=rnorm(100),WBC_decmean_women=rep(NA,length(dummydata)),WBC_decmean_men=rep(NA,length(dummydata)),RBC_decmean_women=rep(NA,length(dummydata)),RBC_decmean_men=rep(NA,length(dummydata)))

...但显然使用正确的值而不是 NA,以及大约 24 个原始变量的列表。

非常感谢任何帮助!

根据我的理解是否正确,我会提议这个巨大的胶带球...

# fake data
dummydata <- data.frame(id=c(1:100),sex=rep(c(1,0),50),WBC=rnorm(100),RBC=rnorm(100))

# a function to calculate decile means
decilemean <- function(x) {
  xrank <- rank(x)
  xdec <- floor((xrank-1)/length(x)*10)+1
  decmeans <- as.numeric(tapply(x,xdec,mean))
  xdecmeans <- decmeans[xdec]
  return(xdecmeans)
}

# looping thru your data columns and making new columns
newcol <- 5          # the first new column to create
for(j in c(3,4)) {   # all of your colums to decilemean-ify
  dummydata[,newcol] <- NA
  dummydata[dummydata$sex==0,newcol] <- decilemean(dummydata[dummydata$sex==0,j])
  names(dummydata)[newcol] <- paste0(names(dummydata)[j],"_decmean_women")
  dummydata[,newcol+1] <- NA
  dummydata[dummydata$sex==1,newcol+1] <- decilemean(dummydata[dummydata$sex==1,j])
  names(dummydata)[newcol+1] <- paste0(names(dummydata)[j],"_decmean_men")
  newcol <- newcol+2
}

尽管如此,我还是建议对其进行测试 ;)