Log Transform многих переменных в R с помощью цикла - PullRequest
1 голос
/ 28 апреля 2020

У меня есть фрейм данных, который имеет двоичную переменную для диагностики (столбец 1) и 165 питательных переменных (столбцы 2-166) для n = 237. Давайте назовем этот набор данных nutr_all. Мне нужно создать 165 новых переменных, которые берут натуральный логарифм каждой из переменных питательных веществ. Итак, я хочу закончить с фреймом данных, который имеет 331 столбец - столбец 1 = диагноз, столбцы 2-166 = переменные питательных веществ, столбцы 167-331 = преобразованные логарифмические переменные питательных веществ. Я хотел бы, чтобы эти переменные принимали имя старых переменных, но с "_log" в конце

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

for (nutr in (nutr_all_nomiss[,2:166])){
 nutr_all_log <- mutate(nutr_all, nutr_log = log(nutr) )
}

Когда я делаю это, он просто создает одну новую переменную с именем nutr_log. Я знаю, что должен сообщить r, что «nutr» в «nutr_log» - это имя переменной для l oop, но я не уверен, как это сделать.

Ответы [ 4 ]

0 голосов
/ 28 апреля 2020

данная функция, использующая dplyr, выполнит вашу задачу, которую можно использовать для получения преобразования журнала для всех переменных в наборе данных, она также проверяет, имеет ли столбец значения -ive. в настоящее время в этой функции он не будет вычислять журнал для этих параметров,

logTransformation<- function(ds)
{
  # this function creats log transformation of dataframe for only varibles which are positive in nature
  # args:
    # ds : Dataset

  require(dplyr)
  if(!class(ds)=="data.frame" ) { stop("ds must be a data frame")}

  ds <- ds %>% 
    dplyr::select_if(is.numeric)


 # to get only postive variables
  varList<- names(ds)[sapply(ds, function(x) min(x,na.rm = T))>0] 

  ds<- ds %>% 
    dplyr::select(all_of(varList)) %>% 
    dplyr::mutate_at(
         setNames(varList, paste0(varList,"_log")), log)
)
  return(ds)
}

вы можете использовать его для своего случая как:

#assuming your binary variable has namebinaryVar
nutr_allTransformed<- nutr_all %>% dplyr::select(-binaryVar) %>% logTransformation()

, если вы хотите иметь и отрицательные переменные , замените varlist как показано ниже:

varList<- names(ds)
0 голосов
/ 28 апреля 2020

В базе R мы можем использовать lapply:

nutr_all_nomiss[paste0(names(nutr_all_nomiss)[2:166], "_log")] <- lapply(nutr_all_nomiss[2:166], log)
0 голосов
/ 28 апреля 2020

Вот решение, использующее только базовую R:

Сначала я создам набор данных, эквивалентный вашему:

nutr_all <- data.frame(
  diagnosis = sample(c(0, 1), size = 237, replace = TRUE)
)

for(i in 2:166){
  nutr_all[i] <- runif(n = 237, 1, 10)
  names(nutr_all)[i] <- paste0("nutrient_", i-1)
}

Теперь давайте создадим новые переменные и добавим их во фрейм данных. :

nutr_all_log <- cbind(nutr_all, log(nutr_all[, -1]))

И это позаботится об именах:

names(nutr_all_log)[167:331] <- paste0(names(nutr_all[-1]), "_log")
0 голосов
/ 28 апреля 2020

Мы можем использовать mutate_at

library(dplyr)
nutr_all_log <- nutr_all_nomiss %>%
                    mutate_at(2:166, list(nutr_log = ~ log(.)))

В base R, мы можем сделать это непосредственно на data.frame

nm1 <- paste0(names(nutr_all_nomiss)[2:166], "_nutr_log")
nutr_all_nomiss[nm1] <- log(nutr_all_nomiss[nm1])
...