Как я могу создать цикл for для подсчета количества значений в векторе, которые попадают между установленной границей? - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь установить верхнюю и нижнюю границу вектора, просто добавляя и вычитая установленное значение из каждого индекса. Затем я хочу создать цикл, который сообщает мне для каждого значения (i) в векторе, сколько других точек в векторе попадает в эту границу.

По сути, создание расчета псевдоплотности на основе количества значений, попадающих в установленный диапазон.

У меня есть вектор "v", который содержит случайные значения. Затем я добавляю / вычитаю три к нему, чтобы получить верхний и нижний диапазоны. Но не могу создать цикл, который будет подсчитывать, сколько других значений из этого вектора попадают в этот.

v <- c(1, 3, 4, 5, 8, 9, 10, 54)

for (i in v){
  vec2 <- (vec +3 > vec[i] & vec -3 < vec[i])
  }
vec2

Я получаю NA из этого кода.

Я также пытался индексировать vec +/- 3, и он также не работал.

vec2 <- (vec[i] +3 > vec[i] & vec - 3 < vec[i))

То, что я хочу, это для каждого значения «i» в векторе, я хочу знать, сколько точек попадают в это значение + и -3.

т.е. первое значение равно 1: верхний предел будет равен 4, а нижний - -2. Я хочу, чтобы он посчитал, сколько значений осталось в векторе, попадающих в это. Который будет 3 для первого индекса (если он включает себя).

vec2 = (3, 4, 3, ...)

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

В вашем цикле for мы можем перебрать все элементы в v, создать диапазон (-3, +3) и проверить, сколько элементов в v попадают в этот диапазон, и сохранить результат в новом вектор vec2.

vec2 <- numeric(length = length(v))
for (i in seq_along(v)) {
   vec2[i] <- sum((v  >= v[i] - 3) & (v <= v[i] + 3))
}
vec2
#[1] 3 4 4 4 4 3 3 1

Однако вы можете избежать цикла for, используя mapply

mapply(function(x, y) sum(v >= y & v <= x), v + 3, v - 3)
#[1] 3 4 4 4 4 3 3 1
1 голос
/ 12 апреля 2019

Вы ищете что-то подобное?Ваш код не работает, потому что ваш синтаксис неправильный.

vec <- c(1, 3, 4, 5, 8, 9, 10, 54) #Input vector

countvalswithin <- vector() #Empty vector that will store counts of values within bounds

#For loop to cycle through values stored in input vector
for(i in 1:length(vec)){
  currval <- vec[i] #Take current value
  lbound <- (currval - 3) #Calculate lower bound w.r.t. this value
  ubound <- (currval + 3) #Calculate upper bound w.r.t. this value

  #Create vector containing all values from source vector except current value
  #This will be used for comparison against current value to find values within bounds.
  othervals <- subset(vec, vec != currval)

  currcount <- 1 #Set to 0 to exclude self; count(er) of values within bounds of current value

  #For loop to cycle through all other values (excluding current value) to find values within bounds of current value
  for(j in 1:length(othervals)){

    #If statement to evaluate whether compared value is within bounds of current value; if it is, counter updates by 1
    if(othervals[j] > lbound & othervals[j] <= ubound){
      currcount <- currcount + 1 
    }

  }

  countvalswithin[i] <- currcount #Append count for current value to a vector

}

df <- data.frame(vec, countvalswithin) #Input vector and respective counts as a dataframe

df

 #    vec countvalswithin
 #  1   1               3
 #  2   3               4
 #  3   4               3
 #  4   5               4
 #  5   8               3
 #  6   9               3
 #  7  10               3
 #  8  54               1

Редактировать: добавлены комментарии к коду, объясняющие, что он делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...