2015-04-01 5 views
1

У меня есть кадр данных в R, и я хотел бы создать новые столбцы в цикле for. Я пробовал много вещей за последние 2 дня, но безуспешно. В конце концов, я нашел решение, которое, кажется, работает, но это не кажется очень прямым. Мне было интересно, есть ли у кого-нибудь более элегантный способ сделать это.
Извините, если это уже было рассмотрено, но я не смог найти аналогичный вопрос на SO
Вот мой пример.Создать столбцы в R в цикле for

x <- runif(20) 
a <- as.data.frame(x) 
for (i in 1:100){ 
    d <- x + i 
    a <- cbind(a, d) 
} 

c <- 1 
for (i in 1:100){ 
    c[i] <- paste0("colum", i) 
    } 
colnames(a) <- c("x", c) 

Заранее спасибо за любые хорошие предложения, чтобы сделать этот процесс все в одном цикле вместо 2.

+1

С одной стороны, вы можете удалить второй цикл полностью. 'paste0 (« colum », 1: 100) дает тот же результат. –

+0

О да. Спасибо за это. Тогда я немного редактирую вопросы. – Franky

ответ

0

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

result <- matrix(x + rep(0:100, length(x)), ncol = 101, byrow = TRUE) 
result <- as.data.frame(result) 
names(result) <- c("x", paste0("column", 1:100)) 

Вы также можете сохранить структуру матрицы, если вы хотите, чтобы хранить номера. Кроме того, вам следует избегать использования cbind, rbind и других функций, которые увеличивают размер объекта с каждой итерацией в цикле. R inferno - хорошая книга для чтения.

2

Возможно, то, что вы ищете eval и parse, как таковой:

for (i in 1:100) { 
    eval(parse(text = paste0('a$colum', i, ' <- whatever_you_want_your_column_to_contain')) 
} 

Это позволит создать именованные столбцы и их содержимое в одном операторе.

+0

Но не забудьте прочитать: 'fortunes :: fortune (106)' –

+0

как я могу позаботиться о назначении только одного ряда в этом контексте? Например, когда я создаю разные столбцы и их имена в каждом цикле, я хотел бы присвоить разные числа определенным строкам каждого столбца. – Ben

0

Почему нет:

a[2:11] <- sapply(1:10, "+", a[[1]]) 

имена будут:

names(a) <- c("x", paste0("column", 1:10)) 
Смежные вопросы