определить, какие точные элементы вектора - PullRequest
5 голосов
/ 23 сентября 2019

У меня есть вектор 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)

Если length (x) == 50: я хотел бы проверить ( TRUE или FALSE )если x точно равен одному из интервалов 1:50 или 51: 100 или 101: 150 или 151: 200 .... или 951: 1000 .

Или если length (x)> 50, Я хотел бы проверить ( TRUE или FALSE ), если 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 и интервалов, таких как этот вопрос .Я хочу знать, соответствует ли x точно одному или объединению этих интервалов.

Ответы [ 3 ]

5 голосов
/ 23 сентября 2019

Вы можете использовать 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
3 голосов
/ 23 сентября 2019

a 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
2 голосов
/ 24 сентября 2019

Другая опция:

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) не выполнит эту часть)

check:

> test(1:50)
#[1] TRUE
> test(2:51)
#[1] FALSE
> test(1:100)
#[1] TRUE
> test(2:101)
#[1] FALSE
...