имена переменных в цикле for - PullRequest
2 голосов
/ 09 июля 2019
x_names <-c("x1","x2","x3")
data <- c(1,2,3,4)
fake <- c(2,3,4,5)

for (i in x_names)
{
  x = fake
  data = as.data.frame(cbind(data,x))  
  #data <- data %>% rename(x_names = x) 
}

Я сделал игрушечный пример.Этот код сгенерирует фрейм данных с 1 столбцом с именем data и 3 столбцами с именем x.Вместо того, чтобы вызывать столбцы x, я хочу, чтобы они назывались x1, x2, x3 (хранятся в x_names).Я вставил в код x_name (закомментируйте), но он не работает.Не могли бы вы помочь мне с этим?

Ответы [ 4 ]

3 голосов
/ 09 июля 2019

Мы также можем использовать map_dfc из tidyverse:

library(tidyverse)

cbind(data, map_dfc(x_names, ~ tibble(!!.x := fake)))

Выход:

  data x1 x2 x3
1    1  2  2  2
2    2  3  3  3
3    3  4  4  4
4    4  5  5  5
1 голос
/ 09 июля 2019

Когда вы заменяете свою строку с комментариями

#data <- data %>% rename(x_names = x)

на

colnames(data)[ncol(data)]  <- i

, она должна установить правильные имена.

1 голос
/ 09 июля 2019

Можно просто назначить «подделку» для создания новых столбцов в base R

data[x_names] <- fake
data
#  data x1 x2 x3
#1    1  2  2  2
#2    2  3  3  3
#3    3  4  4  4
#4    4  5  5  5

РЕДАКТИРОВАТЬ: на основе комментариев из @avid_useR

data

data <- data.frame(data)
1 голос
/ 09 июля 2019

Мы можем избежать цикла for и использовать replicate для повторения fake данных, используя setNames для присвоения имени фрейму данных x_names.

cbind(data, setNames(data.frame(replicate(length(x_names), fake)), x_names))

#  data x1 x2 x3
#1    1  2  2  2
#2    2  3  3  3
#3    3  4  4  4
#4    4  5  5  5

В идеале следует избегать растущих объектов в цикле, однако один из способов решения проблемы ОП в цикле -

for (i in seq_along(x_names)) {
    data = cbind.data.frame(data, fake)
    names(data)[i + 1] <- x_names[i]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...