如何识别向量的确切元素是什么?
How to identify what are the exact elements of a vector?
我有一个向量 x
的形式:
x=c(601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614,
615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630,
631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646,
647, 648, 649, 650)
If length (x) == 50
:我想测试(TRUE 或 FALSE)如果 x 是正好等于区间 1:50 或 51:100 或 101:150 或 151:200 .... 或 951:1000.
Or if length (x)> 50
, 我想测试 (TRUE or FALSE) if x正好等于由 ((1:50 U 51: 100) 或 (1:50 U 101: 150) 或 (51 : 100 U 151: 200) ....).
我的尝试:
all(
x == c(1:50) |
x == c(51:100) |
x == c(101:150) |
x == c(151:200) |
x == c(201:250) |
x == c(251:300) |
x == c(301:350) |
x == c(351:400) |
x == c(401:450) |
x == c(451:500) |
x == c(501:550) |
x == c(551:600) |
x == c(601:650) |
x == c(651:700) |
x == c(701:750) |
x == c(751:800) |
x == c(801:850) |
x == c(851:900) |
x == c(901:950) |
x == c(951:1000)
)
我想优化这段代码。
PS:我不想让 x
元素的频率 table 和间隔 。我想知道 x
是否完全对应于这些间隔的一个或并集。
您可以使用cut
,即
unique(cut(x, breaks = seq(0, 1000, by = 50)))
#[1] (600,650]
如果你想要一个布尔值 如果 x
包含在其中一个间隔中,那么你可以这样做,
unique(cut(x, breaks = seq(0, 1000, by = 50))) != ''
#[1] TRUE
#or If you only want to be in 1 group, then as suggested by Ronak,
length(unique(cut(x, breaks = seq(0, 1000, by = 50)))) == 1
#[1] TRUE
一个data.table
解决方案:
test <- function(u){
ifelse(all(as.data.table(u)[,
.N,
by = cut(u,
breaks = seq(0, 1000, 50))][, unique(N)] == 50),
TRUE,
FALSE)
}
测试:
x <- 1:50 # TRUE
y <- 2:51 # FALSE
z <- 1:100 # TRUE
w <- 2:101 # FALSE
test(x)
> TRUE
test(y)
> FALSE
test(z)
> TRUE
test(w)
> FALSE
另一个选项:
test <- function(x) length(x)%%50==0 & x[length(x)]%%50==0 & all(diff(x)==1)
length(x)%%50==0
确保向量的长度是 50 的倍数。
x[length(x)]%%50==0
检查最后一个元素是否可以被 50 整除。
all(diff(x)==1)
检查向量是否为步长为 1 的序列。(例如 x <- rep(50,50)
这部分将失败)
检查:
> test(1:50)
#[1] TRUE
> test(2:51)
#[1] FALSE
> test(1:100)
#[1] TRUE
> test(2:101)
#[1] FALSE
我有一个向量 x
的形式:
x=c(601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614,
615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630,
631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646,
647, 648, 649, 650)
If length (x) == 50
:我想测试(TRUE 或 FALSE)如果 x 是正好等于区间 1:50 或 51:100 或 101:150 或 151:200 .... 或 951:1000.
Or if length (x)> 50
, 我想测试 (TRUE or FALSE) if x正好等于由 ((1:50 U 51: 100) 或 (1:50 U 101: 150) 或 (51 : 100 U 151: 200) ....).
我的尝试:
all(
x == c(1:50) |
x == c(51:100) |
x == c(101:150) |
x == c(151:200) |
x == c(201:250) |
x == c(251:300) |
x == c(301:350) |
x == c(351:400) |
x == c(401:450) |
x == c(451:500) |
x == c(501:550) |
x == c(551:600) |
x == c(601:650) |
x == c(651:700) |
x == c(701:750) |
x == c(751:800) |
x == c(801:850) |
x == c(851:900) |
x == c(901:950) |
x == c(951:1000)
)
我想优化这段代码。
PS:我不想让 x
元素的频率 table 和间隔 x
是否完全对应于这些间隔的一个或并集。
您可以使用cut
,即
unique(cut(x, breaks = seq(0, 1000, by = 50)))
#[1] (600,650]
如果你想要一个布尔值 如果 x
包含在其中一个间隔中,那么你可以这样做,
unique(cut(x, breaks = seq(0, 1000, by = 50))) != ''
#[1] TRUE
#or If you only want to be in 1 group, then as suggested by Ronak,
length(unique(cut(x, breaks = seq(0, 1000, by = 50)))) == 1
#[1] TRUE
一个data.table
解决方案:
test <- function(u){
ifelse(all(as.data.table(u)[,
.N,
by = cut(u,
breaks = seq(0, 1000, 50))][, unique(N)] == 50),
TRUE,
FALSE)
}
测试:
x <- 1:50 # TRUE
y <- 2:51 # FALSE
z <- 1:100 # TRUE
w <- 2:101 # FALSE
test(x)
> TRUE
test(y)
> FALSE
test(z)
> TRUE
test(w)
> FALSE
另一个选项:
test <- function(x) length(x)%%50==0 & x[length(x)]%%50==0 & all(diff(x)==1)
length(x)%%50==0
确保向量的长度是 50 的倍数。
x[length(x)]%%50==0
检查最后一个元素是否可以被 50 整除。
all(diff(x)==1)
检查向量是否为步长为 1 的序列。(例如 x <- rep(50,50)
这部分将失败)
检查:
> test(1:50)
#[1] TRUE
> test(2:51)
#[1] FALSE
> test(1:100)
#[1] TRUE
> test(2:101)
#[1] FALSE