Как создать функцию с уже написанным для -l oop для автоматического создания векторов в среде r - PullRequest
0 голосов
/ 22 января 2020

У меня есть df с фиксированными столбцами и нефиксированным номером строки. Я создал пустые векторы и заполнил команды R, чтобы создавать векторы самостоятельно, когда я использую eval(parse(text = someVector)). То, что я сделал с for-loop, работает, но я хотел бы превратить его в функцию и / или использовать *apply(), и я не знаю, как это сделать. Я бы очень хотел улучшить свои навыки программирования. Я хотел бы иметь возможность выбирать переменные по имени или положению и всегда go в каждой строке.

при работе с представлением, я ожидаю 30 векторов, созданных в рабочей среде - для каждой модели автомобиля для заданный столбец отдельный вектор для хранения значения этого столбца для этой строки / модели и еще 6 векторов, в которых хранятся команды R.

например, один из векторов должен выглядеть следующим образом: cyl_MazdaRX4Wag <- 6

# df
df <- mtcars[1:5,]  
df$carmodel <- gsub("[[:space:]]", "", rownames(df))


# create empty vectors to store R command 
carmodel <- c() 
mpg <- c() 
cyl <- c() 
hp <- c() 
gear <- c() 
carb <- c()

# loop through every row to create an R command
for(i in 1:nrow(df)){
     carmodel[i] <-  paste0("carmodel_", df$carmodel[i] , " <- ", "'", df$carmodel[i], "'",";")
     mpg[i] <-  paste0("mpg_", df$carmodel[i],  " <- ", df$mpg[i], ";")   
     cyl[i] <-  paste0("cyl_", df$carmodel[i],  " <- ", df$cyl[i], ";")   
     hp[i] <-  paste0("hp_", df$carmodel[i],  " <- ", df$hp[i], ";") 
     gear[i] <-  paste0("gear_", df$carmodel[i],  " <- ", df$gear[i], ";")  
     carb[i] <-  paste0("carb_", df$carmodel[i],  " <- ", df$carb[i], ";")  
}
# collapse the vectors in one string
carmodel <- paste(carmodel, collapse = " ") 
mpg <- paste(mpg, collapse = " ")
cyl <- paste(cyl, collapse = " ")
hp <- paste(hp, collapse = " ") 
gear <- paste(gear, collapse = " ") 
carb <- paste(carb, collapse = " ")

# execute R command
eval(parse(text = carmodel)) 
eval(parse(text = mpg)) 
eval(parse(text = cyl)) 
eval(parse(text = hp)) 

# delete vectors that store the R commands
rm(list = c("carmodel","mpg","cyl", "hp","gear","carb"))
eval(parse(text = gear)) 
eval(parse(text = carb))

1 Ответ

2 голосов
/ 22 января 2020

Мы можем выбрать столбцы, над которыми мы хотим работать. Создайте именованный вектор с именем и его значением.

cols <- c('carmodel', 'mpg', 'cyl', 'hp', 'gear', 'carb')
temp <- unlist(lapply(cols, function(x) as.list(setNames(df[[x]], 
                           paste0(x, df$carmodel)))), recursive = FALSE)

Обычно лучше хранить данные в виде списка, а не отдельных объектов. Если они нужны вам как отдельные переменные в глобальной среде, мы можем использовать list2env.

list2env(temp, .GlobalEnv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...