创建新的按顺序命名的变量并填充水平平均值
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
}
尽管如此,我还是建议对其进行测试 ;)
警告:多部分问题!
我意识到其中的一部分已经在其他地方得到了解答,但我正在努力将它们整合到一个简洁的代码中....
我有一个数据框,其中包含许多 (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
}
尽管如此,我还是建议对其进行测试 ;)