Для L oop с оператором If / If Else с простыми математическими функциями требуется помощь в сохранении - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь создать простой For L oop, который будет проходить через столбец чисел в моем кадре данных и выполнять три различные простые математические функции для столбца чисел на основе простых условий.

В основном, если мое значение RiB меньше или больше константы (pos_RiB <- 0.011, neg_RiB <- -0.011) Я хочу, чтобы написанная мной функция выполняла математические вычисления для значения RiB и сохраняла его, если значение RiB находится между константами, я хочу, чтобы значение RiB просто сохранялось как есть. </p>

Вот мой код:

#Set empty storage vector
vec <- vector()
#Set positive and negative RiB constants for loop

#Create functions for different atmospheric stability conditions 

RiB <- sp3_join_a$RiB 

Unstable <- function(RiB){
 (1-(16*RiB))^0.75
}


Stable <- function(RiB){
  (1-(5*RiB))^2
}

Neutral <- function(RiB){
  RiB == RiB
}

#Condition constants
pos_RiB <- 0.011
neg_RiB <- -0.011

#For Loop
for(i in (sp3_join_a$RiB)){
  if (sp3_join_a$RiB > pos_RiB){
   vec[i] <- Unstable(sp3_join_a$RiB[i])
  }
  else if (sp3_join_a$RiB < neg_RiB){
  vec[i] <- Stable(sp3_join_a$RiB[i])
  }
  else (sp3_join_a$RiB < pos_RiB && sp3_join_a > neg_RiB)
  vec[i] <- Neutral(sp3_join_a$RiB[i])
}

sp3_join_a$vec <- vec

В моем фрейме данных sp3_join_a $ значения RiB имеют цифры c и выглядят как (0,15099768 0,13389330 0,08309406 0,06137715 0,06234167 0,05491064 0,04332422 0,05 593 053,03,05,053,05,063,063,063,063,063,063,063,063,063,063,05,063,05,063,05,063,05,063,05,063,05,063,05,058,05,075,058,05,075,058,05,086,05,058,05,086,058,05 0 были бы увеличивать *.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Используя data.table, вы можете связывать выражения и выполнять условное поднабор и присваивать значения по ссылке, избегая при этом для l oop

library(data.table)
# dummy data
sp3_join_a <- data.table(RiB = runif(100, -0.015, 0.015))

pos_RiB <- 0.011
neg_RiB <- -0.011

Тогда решение будет:

# Chaining expressions with (sub)assignment on conditional subsets 
sp3_join_a[, vec := RiB][RiB > pos_RiB, vec := (1-(16*RiB))^0.75][RiB < neg_RiB, vec := (1-(5*RiB))^2]

Обратите внимание, что вы можете использовать стандартный синтаксис base R для очень похожего подхода, я просто использовал data.table, потому что он более эффективен.

sp3_join_a[,"vec"] <- sp3_join_a[,"RiB"] 
sp3_join_a[sp3_join_a[,"RiB"] > pos_RiB, "vec"] <- Unstable(sp3_join_a[sp3_join_a[,"RiB"] > pos_RiB, "RiB"])
sp3_join_a[sp3_join_a[,"RiB"] < neg_RiB, "vec"] <- Stable(sp3_join_a[sp3_join_a[,"RiB"] < neg_RiB, "RiB"])

Чтобы использовать ваш l oop, я бы предложил несколько настроек

# send RiB to vec column as is before the loop
sp3_join_a$vec <- sp3_join_a$RiB

# i needs to reference by position (1:nRows)
for(i in 1:length(sp3_join_a$RiB)){
# assign straight to the dataframe 
  if (sp3_join_a$RiB[i] > pos_RiB){
   sp3_join_a$vec[i] <- Unstable(sp3_join_a$RiB[i])
  }
  if (sp3_join_a$RiB[i] < neg_RiB){
   sp3_join_a$vec[i] <- Stable(sp3_join_a$RiB[i])
  }
}
0 голосов
/ 02 апреля 2020

Может быть, вы можете попробовать вложенный ifelse

sp3_join_a <- within(sp3_join_a,
                     vec <- ifelse(RiB > pos_RiB,
                                   Unstable(RiB),
                                   ifelse(RiB < neg_RiB,
                                          Stable(RiB),
                                          Neutral(RiB))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...