R для цикла игнорирует условный оператор if - PullRequest
0 голосов
/ 06 июня 2019

Я работаю с набором данных, в котором мне нужно R, чтобы пропустить его, если значение НЕ отсутствует.Я пытался создать цикл for, но R игнорирует мою логику.Я видел другие для сообщений цикла, но они не включают условное игнорирование.

Вот пример набора данных:

library(dplyr)
  my_problem <- tibble(name = c("Joe", "Joseph", "Joey"),
                       score1 = c(2, 7, 12),
                       score2 = c(NA, 5, 10))

Вот как я хочу, чтобы он выглядел:

solution <- tibble(name = c("Joe", "Joseph", "Joey"),
                     score1 = c(1, 7, 12),
                     score2 = c(NA, 5, 10),
                     score2edit = c(.30103, 5, 10))

А вот мой цикл for с преобразованием log10 () для Score1, если в столбце Score2 указано NA.Однако по какой-то причине код игнорирует мое выражение if и сразу переходит к другому.

  for(i in 1:nrow(my_problem)) {
    if(is.na(my_problem$score2[i])) {
      my_problem$score2edit <- log10(my_problem$score1)
    } else {
      my_problem$score2edit <- my_problem$score2
    }
  }

Спасибо!Если бы вы могли также объяснить, почему этот цикл не работает, это было бы очень полезно.

1 Ответ

3 голосов
/ 06 июня 2019

Мы можем использовать векторизованные параметры (ifelse/if_else/case_when)

library(dplyr)
my_problem %>% 
    mutate(score2edit = case_when(is.na(score2) ~ log10(score1), TRUE ~ score2))
# A tibble: 3 x 4
#  name   score1 score2 score2edit
#  <chr>   <dbl>  <dbl>      <dbl>
#1 Joe         2     NA      0.301
#2 Joseph      7      5      5    
#3 Joey       12     10     10   

Цикл for проходит по каждой строке, поэтому, если мы используем это, а затем выполняем присваивание / замену длявесь набор данных, весь столбец заменяется в каждой строке

...