#r #loops #for-loop
#r #циклы #цикл for
Вопрос:
Я пытаюсь установить верхнюю и нижнюю границы вектора, просто добавляя и вычитая заданное значение из каждого индекса. Затем я хочу создать цикл, который сообщает мне для каждого значения (i) в векторе, сколько других точек в векторе попадает в эту границу.
По сути, создание вычисления псевдоплотности на основе того, сколько значений попадает в установленный диапазон.
У меня есть мой вектор «v», который содержит случайные значения. Затем я добавляю / вычитаю из него три, чтобы получить верхний и нижний диапазоны. Но не могу создать цикл, который будет подсчитывать, сколько других значений из этого вектора попадают в него.
v <- c(1, 3, 4, 5, 8, 9, 10, 54)
for (i in v){
vec2 <- (vec 3 > vec[i] amp; vec -3 < vec[i])
}
vec2
Я получаю NA из этого кода.
Я также пробовал индексировать vec /- 3, и это также не сработало.
vec2 <- (vec[i] 3 > vec[i] amp; vec - 3 < vec[i))
Я хочу, чтобы для каждого значения «i» в векторе я хотел знать, сколько точек попадает в это значение и -3.
т.е. первое значение равно 1: таким образом, верхний предел будет равен 4, а нижний -2. Я хочу, чтобы он подсчитывал, сколько значений, оставшихся в векторе, попадают в это. Что будет равно 3 для первого индекса (если он включает себя).
vec2 = (3, 4, 3, . . . )
Ответ №1:
Вы ищете что-то подобное? Ваш код не работает, потому что ваш синтаксис неверен.
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 amp; 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
Редактировать: добавлены комментарии к коду, объясняющие, что он делает.
Комментарии:
1. Да, это здорово. Спасибо. Мне определенно нужно больше практики с циклами. Можете ли вы объяснить, что делает «if» (без использования оператора «else» с ним?
2. Я добавил пояснительные комментарии к коду. Здесь вам не нужно
else
предложение, поскольку вас интересует только то, находится ли значение в пределах границ (т. Е.else
Условие неявно и не имеет значения).
Ответ №2:
В вашем for
цикле мы можем перебирать каждый элемент в v
, создавать диапазон (-3, 3) и проверять, сколько элементов в v
попадает в этот диапазон, и сохранять результат в новом векторе vec2
.
vec2 <- numeric(length = length(v))
for (i in seq_along(v)) {
vec2[i] <- sum((v >= v[i] - 3) amp; (v <= v[i] 3))
}
vec2
#[1] 3 4 4 4 4 3 3 1
Однако вы можете избежать for
цикла, используя mapply
mapply(function(x, y) sum(v >= y amp; v <= x), v 3, v - 3)
#[1] 3 4 4 4 4 3 3 1