增加每第n个范围R.

时间:2016-01-12 08:51:37

标签: r sequence auto-increment

我正在编写R代码,其中有一个向量' x'它包含值1到100,我想创建另一个向量' 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&lt; - 1001:1100,x [y]应该返回:

  1001 1002 1003 1011 1012 1013 1021 1022 1023 1031 1032 1033 1041 1042 1043...etc

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

您可以使用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范围内,如果是,则返回TRUE,否则为FALSE。然后,此逻辑索引用于子集x

如果您的目标不是以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)整除,以使其正常工作。

答案 1 :(得分:1)

为了好玩,使用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

答案 2 :(得分:1)

这可能会对你有所帮助:

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]))
}

答案 3 :(得分:0)

嗯。这开始很有趣,但现在我碰巧喜欢它,因为它的构建方式与问题的作者基本相同:

> 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