Создайте новые переменные с последовательными именами и заполните их средним уровнем

Внимание: вопрос из нескольких частей!

Я понимаю, что на части этого ответа был дан ответ в другом месте, но я изо всех сил пытаюсь собрать их вместе в красивом скупом фрагменте кода....

У меня есть фрейм данных с количеством (24) числовых столбцов, представляющих интерес. Для каждого столбца я хочу создать новую переменную в том же фрейме данных (с разумным названием), в которой значения соответствуют среднему значению дециля, специфичного для пола, для этой переменной (пол находится в другом столбце, кодируется 0/1) .

Новыми именами столбцов из исходного столбца с названием «WBC» могут быть, например: «WBC_meandec_women» и «WBC_meandec_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 исходных переменных.

Любая помощь очень ценится!


person user4575913    schedule 27.02.2017    source источник


Ответы (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
}

Тем не менее, я бы рекомендовал попробовать ;)

person Matt Tyers    schedule 27.02.2017
comment
Супер Мэтт, кажется, это работает! Прекрасные и маленькие тоже, большое спасибо! - person user4575913; 28.02.2017