我有以下数据框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
答案 0 :(得分: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 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
一个简单的for循环应该可以解决这个问题:
for (i in 3:16){
u[ , sprintf("a%.0d", i)] <- u[, i-1] + 3
}
答案 4 :(得分: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))
}
这使用for循环并为您提供所需的列名称。