警告:多部分问题!
我意识到其中的部分内容已在其他地方得到解答,但我正在努力将它们整合在一个非常简洁的代码中......
我有一个数据框,其中包含数(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个原始变量的列表。
任何帮助都非常感谢!
答案 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
}
我建议测试它;)