2016-11-21 3 views
2

У меня есть следующие dataframe uДобавление нескольких столбцов одновременно на основе последовательности

u <- data.frame(a1 = c("a", "b", "c"), a2 = c(2, 1, 3)) 

Я хочу добавить еще 14 колонн одновременно на основе простой последовательности, которая должна создать новый столбец, добавив константу 3 до последнего колонка. полученный кадр данных:

a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 
a 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 
b 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 
c 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 

ответ

7

Я бы векторизации это следующим образом

u[paste0("a", 3:16)] <- matrix(u$a2 + rep(3*1:14, each = 3), nrow = 3) 
u 
# a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 
# 1 a 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 
# 2 b 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 
# 3 c 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 
1

Мы можем использовать sapply в цикле над каждым элементом a2 колонны и генерировать последовательность из этого числа, увеличение его на 3 и выходом 15 значений (колонка 2 закончена здесь написано)

temp = cbind(u[1], t(sapply(u$a2, function(x) seq(x, by = 3, length.out = 15)))) 
temp 

# a1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
#1 a 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 
#2 b 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 
#3 c 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 
0

простой цикл должен сделать трюк:

for (i in 3:16){ 
    u[ , sprintf("a%.0d", i)] <- u[, i-1] + 3 
} 
0
u<-data.frame(a1=c("a","b","c"),a2=c(2,1,3)) 
for(i in 1:14){ 
u[,ncol(u)+1] <- u[,ncol(u)]+3 
    names(u)[ncol(u)]<-paste0("a",ncol(u)) 
} 

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

3
u[paste0("a",3:16)] = as.data.frame(lapply(1:14, function(x) u$a2+3*x)) 
# a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 
#1 a 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 
#2 b 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 
#3 c 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 
Смежные вопросы