从 R 中的 (1, 2, 3, 4) 获取 (1, 2, 3, 4, 2, 3, 4, 3, 4, 4)
Get (1, 2, 3, 4, 2, 3, 4, 3, 4, 4) from (1, 2, 3, 4) in R
我有向量
z1 <- c(1, 2, 3, 4)
并想从中得到另一个向量
z2 <- c(1, 2, 3, 4,
2, 3, 4,
3, 4,
4)
我尝试了 rep() 函数的不同变体,但只得到这个
z3 <- rep(z1, times=seq(length(z1), 1))
z3 <- c(1, 1, 1, 1,
2, 2, 2,
3, 3,
4)
z2 也可以用 for() 循环完成
temp <- z1
res <- c()
for (i in 1:length(z1)){
res <- c(res, temp)
temp <- temp[-1]
}
res <- c(1, 2, 3, 4,
2, 3, 4,
3, 4,
4)
但是有什么方法可以使用一个字符串内置函数(如 rep())将 z1 转换为 z2 吗?
编辑:更新 post 以说明有序解决方案
通过将每个值重复最大次数来填充矩阵。然后取矩阵的下三角。注意:在这种情况下使用 length(z1)
以便注意值必须是整数,如果该值有意义,请改用 max(z1)
。
z2 <- matrix(data = rep(z1, times = length(z1)), ncol = length(z1), byrow = FALSE)
z2
结果矩阵
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 3 3
[4,] 4 4 4 4
使用 lower.tri
对矩阵进行子集化以提取下三角和对角线
z2 <- z2[lower.tri(z2, diag = TRUE)]
print(z2)
结果
[1] 1 2 3 4 2 3 4 3 4 4
前一个部分解(无序解)
使用 lapply
遍历向量,在每次迭代中,使用 rep
将每个元素重复所需的次数,然后 unlist
将结果转换为矢量
z1 <- c(1, 2, 3, 4)
z2 <- unlist(lapply(z1, function(x) rep(x, times = x)))
print(z2)
结果
[1] 1 2 2 3 3 3 4 4 4 4
c(z1, unlist(lapply(1:length(z1), function(x) z1[-c(1:x)])))
[1] 1 2 3 4 2 3 4 3 4 4
您可以像下面这样尝试 sapply
+ unlist
+ tail
> unlist(sapply(-seq_along(z1), tail, x = c(NA, z1)))
[1] 1 2 3 4 2 3 4 3 4 4
使用 eval 解析的基础 R:
z1 <- c(1, 2, 3, 4)
max_num <- max(z1)
unlist(lapply(paste(z1, max_num, sep = ":"), function(x){
eval(parse(text=x))
}
)
)
我有向量
z1 <- c(1, 2, 3, 4)
并想从中得到另一个向量
z2 <- c(1, 2, 3, 4,
2, 3, 4,
3, 4,
4)
我尝试了 rep() 函数的不同变体,但只得到这个
z3 <- rep(z1, times=seq(length(z1), 1))
z3 <- c(1, 1, 1, 1,
2, 2, 2,
3, 3,
4)
z2 也可以用 for() 循环完成
temp <- z1
res <- c()
for (i in 1:length(z1)){
res <- c(res, temp)
temp <- temp[-1]
}
res <- c(1, 2, 3, 4,
2, 3, 4,
3, 4,
4)
但是有什么方法可以使用一个字符串内置函数(如 rep())将 z1 转换为 z2 吗?
编辑:更新 post 以说明有序解决方案
通过将每个值重复最大次数来填充矩阵。然后取矩阵的下三角。注意:在这种情况下使用 length(z1)
以便注意值必须是整数,如果该值有意义,请改用 max(z1)
。
z2 <- matrix(data = rep(z1, times = length(z1)), ncol = length(z1), byrow = FALSE)
z2
结果矩阵
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 3 3
[4,] 4 4 4 4
使用 lower.tri
对矩阵进行子集化以提取下三角和对角线
z2 <- z2[lower.tri(z2, diag = TRUE)]
print(z2)
结果
[1] 1 2 3 4 2 3 4 3 4 4
前一个部分解(无序解)
使用 lapply
遍历向量,在每次迭代中,使用 rep
将每个元素重复所需的次数,然后 unlist
将结果转换为矢量
z1 <- c(1, 2, 3, 4)
z2 <- unlist(lapply(z1, function(x) rep(x, times = x)))
print(z2)
结果
[1] 1 2 2 3 3 3 4 4 4 4
c(z1, unlist(lapply(1:length(z1), function(x) z1[-c(1:x)])))
[1] 1 2 3 4 2 3 4 3 4 4
您可以像下面这样尝试 sapply
+ unlist
+ tail
> unlist(sapply(-seq_along(z1), tail, x = c(NA, z1)))
[1] 1 2 3 4 2 3 4 3 4 4
使用 eval 解析的基础 R:
z1 <- c(1, 2, 3, 4)
max_num <- max(z1)
unlist(lapply(paste(z1, max_num, sep = ":"), function(x){
eval(parse(text=x))
}
)
)