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

时间:2017-02-27 10:58:54

标签: r mean quantile

警告:多部分问题!

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

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

原始列中的新列名称为' WBC'例如:WBC_meandec_women' WBC_meandeac_men'。

我已经尝试了各种代码来首先创建新变量,然后分配与十分位数相关的值,但没有一个工作得很好,并且无法弄清楚如何将它们组合在一起。我只知道有一种聪明的方法可以将所有部分放入相同的代码块中,我只是不能在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个原始变量的列表。

任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:1)

根据我是否理解你,我会提出这个巨大的胶带球...

# 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
}

我建议测试它;)