2017-02-27 34 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