2017-02-27 65 views
1

警告:多部分问题!创建新的按顺序命名的变量并填写平均值

我意识到这部分已经回答了其他地方,但我在努力把他们聚在一起的代码一个不错的简约位....

我有一个数据帧与数字列的数目(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))) 

......但显然用正确的值代替了NAs,并且列出了大约24个原始变量。

任何帮助非常感谢!

回答

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 
} 

我建议,虽然测试它;)

+0

超马特,似乎工作!可爱又小巧,非常感谢! – user4575913