ifelse () оценивается только для совпадающих строк - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть data.frame со специальным столбцом a.Этот столбец может быть либо числом, либо ОСОБЕННЫМ значением, которое говорит мне посмотреть на столбец b.

foo <- tibble(
  a=c("15", "20", "SPECIAL", "13"),
  b=c(NA, NA, 32, NA)
)

Было бы здорово, если бы я мог преобразовать это, используя dplyr

foo %>%
  mutate(
    a=ifelse(a == "SPECIAL",
             b,
             as.numeric(a)
      )
  )

Хорошо выглядит, хорошо читает.К сожалению, ifelse(test, yes, no) оценивает оба аргумента yes и no.И, конечно же, as.numeric(a) выдает предупреждение для SPECIAL.

Есть ли какая-нибудь альтернатива для ifelse, которая может автоматически разбить сначала data.frame?Я хочу избегать оценки as.numeric(a)

Примечание: отредактируйте, чтобы сделать проблему более понятной

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

tidyr::separate будет работать здесь

foo <- tibble(
  a=c("15", "20", "3x10", "13")
)

foo %>%
  separate(a, into = c("a", "new_col"), sep = "x")

# A tibble: 4 x 2
  a     new_col
  <chr> <chr>  
1 15    NA     
2 20    NA     
3 3     10     
4 13    NA 
0 голосов
/ 03 декабря 2018
sapply(strsplit(foo$a, "x"), function(x) {prod(as.numeric(x))})

в dplyr:: синтаксис:

foo %>%
    mutate( a = sapply(strsplit(a, "x"), function(x) {prod(as.numeric(x))}) )

# A tibble: 4 x 1
#      a
#  <dbl>
#1    15
#2    20
#3    30
#4    13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...