R: динамический вызов переменных внутри цикла - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно вызвать переменную внутри цикла и использовать ее в качестве имени моего столбца:

Это пример набора данных:

mtcars.df <- mtcars

Ожидаемый результат:

mtcars.df <- mtcars.df %>% add_column(a1 = sample (1:4, 32, replace = TRUE), b1 = sample (1:4, 32, replace = TRUE), c1 = sample (1:4, 32, replace = TRUE))

Таким образом, a1, b1 и c1 должны быть созданы внутри цикла и переименованы в a1, b1 и c1. Имена более длинные (и разные комбинации) в исходном наборе данных, но это определено в переменной mpg.filename.

Это то, что я пробовал до сих пор: 1-й, очевидно, не дает желаемого результата, он просто показывает, чего я хочу достичь.

mpg.filename <- c("a1.file", "b1.file", "c1.file")
for (i in mpg.filename) {
  sample.name <- unlist(strsplit(as.character(i), '.', fixed = TRUE))[1]
  mtcars.df$i <- sample (1:4, 32, replace = TRUE)
}

for (i in mpg.filename) {
  sample.name <- unlist(strsplit(as.character(i), '.', fixed = TRUE))[1]
  mtcars.df$temp.var <- sample (1:4, 32, replace = TRUE)
  temp.name <- paste0 (sample.name) %>% rlang::parse_expr()
  mtcars.df <- mtcars.df %>% rename (eval (sample.name) = temp.var)
}

for (i in mpg.filename) {
  sample.name <- unlist(strsplit(as.character(i), '.', fixed = TRUE))[1]
  mtcars.df$temp.var <- sample (1:4, 32, replace = TRUE)
  temp.name <- paste0 (sample.name) %>% rlang::parse_expr()
  mtcars.df <- mtcars.df %>% rename (syms(sample.name) = temp.var)
}

Я тоже пробовал get, as.symbol, parse (text = "sample.name"), но тоже не сработало.

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

использование eval () в строке для доступа к атрибутам объекта в R

вызов столбцов внутри цикла for в R

Получение строк, распознаваемых как имена переменных в R

Как вычислить выражение с переменными в R?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Ваша первая попытка была близка! Если вы хотите получить доступ / создать столбцы в data.frame, используя символ, вам нужно использовать [[ вместо $. Нет необходимости в символах / разборе / другой сложной ерунде, если это все, что вам нужно сделать.

for(i in mpg.filename) {
  sample.name <- unlist(strsplit(as.character(i), '.', fixed = TRUE))[1]
  mtcars.df[[sample.name]] <- sample(1:4, 32, replace=TRUE)
}
0 голосов
/ 16 ноября 2018

Дайте мне знать, если это удалось -

mpg.filename <- c("a1.file", "b1.file", "c1.file")
for (i in 1:length(mpg.filename)) {
  sample.name <- unlist(strsplit(as.character(mpg.filename[i]), '.', fixed = TRUE))[1]
  mtcars.df$i <- sample (1:4, 32, replace = TRUE)
  colnames(mtcars.df)[length(mtcars.df)]<-paste(sample.name)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...