每第 n 个范围递增 R
Increment every nth range R
我正在编写 R 代码,其中有一个包含值 1 到 100 的向量 'x',我想创建另一个向量 'y',它在每个第 n 个范围内对一系列值进行子集化。我确定我可以使用 rep() 和 seq() 但我无法弄清楚代码来获得我需要的东西。输出应该是这样的
x <- 1:100
y <- 1 2 3 11 12 13 21 22 23 31 32 33 41 42 43 51 52 53 61 62 63 71 72 73 81 82 83 91 92 93
所以如果我确实有一个向量 x <- 1001:1100,x[y] 应该 return:
1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043...etc
有什么想法吗?
你可以使用 grepl
:
x <- 1001:1100
y <- grepl("[1-3]$", x)
x[y]
# [1] 1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043 1051 1052
#[18] 1053 1061 1062 1063 1071 1072 1073 1081 1082 1083 1091 1092 1093
它只是检查 x
的每个元素的最后一位是否在 1、2 或 3 的范围内,如果是,则 returns TRUE
,否则 FALSE
。然后使用此逻辑索引对 x
.
进行子集化
如果您的 objective 不是对以 1,2 或 3 结尾的元素进行子集化,而是始终对 3 个元素进行子集化,然后省略 7,然后再次对 3 进行子集化等...您可以做:
x <- 1001:1100
y <- rep(c(TRUE, FALSE), c(3, 7))
x[y]
# [1] 1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043 1051 1052
#[18] 1053 1061 1062 1063 1071 1072 1073 1081 1082 1083 1091 1092 1093
在这种情况下,再次符合逻辑的向量 y
被回收 - 请注意 length(x)
应该被 length(y)
整除才能正常工作。
为了好玩,与 outer
:
x <- 1001:1100
y <- as.vector(outer(1:3, seq(0, length(x)-10, 10), "+"))
x[y]
# [1] 1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043
# [16] 1051 1052 1053 1061 1062 1063 1071 1072 1073 1081 1082 1083 1091 1092 1093
可能这对你有帮助:
x <- 1:100
y <- as.integer()
for(i in seq(1, length(x), 10)) {
y <- append(y, c(x[i], x[i+1], x[i+2]))
}
嗯。这开始很有趣,但现在我碰巧喜欢它,因为它的构造方式与问题作者提出的基本相同:
> do.call("c",lapply(0:5,function(X) 1:3+10*X))
[1] 1 2 3 11 12 13 21 22 23 31 32 33 41 42 43 51 52 53
我正在编写 R 代码,其中有一个包含值 1 到 100 的向量 'x',我想创建另一个向量 'y',它在每个第 n 个范围内对一系列值进行子集化。我确定我可以使用 rep() 和 seq() 但我无法弄清楚代码来获得我需要的东西。输出应该是这样的
x <- 1:100
y <- 1 2 3 11 12 13 21 22 23 31 32 33 41 42 43 51 52 53 61 62 63 71 72 73 81 82 83 91 92 93
所以如果我确实有一个向量 x <- 1001:1100,x[y] 应该 return:
1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043...etc
有什么想法吗?
你可以使用 grepl
:
x <- 1001:1100
y <- grepl("[1-3]$", x)
x[y]
# [1] 1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043 1051 1052
#[18] 1053 1061 1062 1063 1071 1072 1073 1081 1082 1083 1091 1092 1093
它只是检查 x
的每个元素的最后一位是否在 1、2 或 3 的范围内,如果是,则 returns TRUE
,否则 FALSE
。然后使用此逻辑索引对 x
.
如果您的 objective 不是对以 1,2 或 3 结尾的元素进行子集化,而是始终对 3 个元素进行子集化,然后省略 7,然后再次对 3 进行子集化等...您可以做:
x <- 1001:1100
y <- rep(c(TRUE, FALSE), c(3, 7))
x[y]
# [1] 1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043 1051 1052
#[18] 1053 1061 1062 1063 1071 1072 1073 1081 1082 1083 1091 1092 1093
在这种情况下,再次符合逻辑的向量 y
被回收 - 请注意 length(x)
应该被 length(y)
整除才能正常工作。
为了好玩,与 outer
:
x <- 1001:1100
y <- as.vector(outer(1:3, seq(0, length(x)-10, 10), "+"))
x[y]
# [1] 1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043
# [16] 1051 1052 1053 1061 1062 1063 1071 1072 1073 1081 1082 1083 1091 1092 1093
可能这对你有帮助:
x <- 1:100
y <- as.integer()
for(i in seq(1, length(x), 10)) {
y <- append(y, c(x[i], x[i+1], x[i+2]))
}
嗯。这开始很有趣,但现在我碰巧喜欢它,因为它的构造方式与问题作者提出的基本相同:
> do.call("c",lapply(0:5,function(X) 1:3+10*X))
[1] 1 2 3 11 12 13 21 22 23 31 32 33 41 42 43 51 52 53