R ifelse утверждение с вложенными условиями - PullRequest
1 голос
/ 17 июня 2019
x=data.frame("l"=c('a','b','d','a','c','c','d'),
             "t"=c(1:7))
x$l1 = ifelse(x$l=="a",1,
              ifelse(x$l=="b",2,
                     ifelse(x$l=="c",3,
                            ifelse(x$l=="d" ,4,
                                   ifelse(x$l=="d" & x$t==7,5,NA)))))

Как видно из последнего утверждения, если l == "d" & t == 7, то l1 должно равняться 5, но оно устанавливается равным 4.

Ответы [ 3 ]

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

ifelse выполнение останавливается, где бы оно ни попадало TRUE.

Просто изменить порядок ваших условий -

x$l1 = ifelse(x$l=="a",1,
              ifelse(x$l=="b",2,
                     ifelse(x$l=="c",3,
                            ifelse(x$l=="d" & x$t==7,5,
                                   ifelse(x$l=="d" ,4,NA)))))
x
  l t l1
1 a 1  1
2 b 2  2
3 d 3  4
4 a 4  1
5 c 5  3
6 c 6  3
7 d 7  5

Также рассмотрите возможность использования case_when() из пакета dplyr;это было бы намного более читабельным.

2 голосов
/ 17 июня 2019

Лучше не использовать вложенные ifelse или case_when.Это можно сделать очень легко и эффективно с помощью набора данных ключ / значение

keydat <- data.frame(l = letters[1:4],l1 = 1:4)
left_join(x, keydat) %>%
     mutate(l1 = replace(l1, l== 'd' & t == 7, 5))
#  l t l1
#1 a 1  1
#2 b 2  2
#3 d 3  4
#4 a 4  1
#5 c 5  3
#6 c 6  3
#7 d 7  5
1 голос
/ 17 июня 2019

Основываясь на ответе @ Shree, здесь появляется версия tidyverse:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

x <- data.frame("l"=c('a','b','d','a','c','c','d'),
             "t"=c(1:7))


x %>% 
  as_tibble() %>% 
  mutate(l1 = case_when(
    l == "a" ~ 1,
    l == "b" ~ 2,
    l == "c" ~ 3,
    l == "d" & t == 7 ~ 5,
    l == "d" ~ 4
  ))
#> # A tibble: 7 x 3
#>   l         t    l1
#>   <fct> <int> <dbl>
#> 1 a         1     1
#> 2 b         2     2
#> 3 d         3     4
#> 4 a         4     1
#> 5 c         5     3
#> 6 c         6     3
#> 7 d         7     5

Создана в 2019-06-17 пакетом Представить (v0.3,0)

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