Создайте несколько новых столбцов, используя разные функции, зависящие от условного оператора - PullRequest
0 голосов
/ 20 марта 2020

Я хотел бы создать несколько новых столбцов во фрейме данных на основе условия. Из прочтения других вопросов я думаю, что для этого требуется функция case_when() в функции mutate(). Хотя я знаком с созданием новых столбцов с использованием mutate(), я не могу заставить его работать с различными функциями, основанными на условных выражениях.

require(tidyverse)

df1 <- tibble(a = c(-0.5, 0, 0.1, 0.5, 0.8),
              b = c(-0.2, NA, 0.3, 0.1, 0.2),
              c = c(0, 0.2, 0.1, 0.3, 0.1),
              d = c(NA, -0.1, 0.7, 0.6, 0.4),
              e = c(0.2, 0.6, NA, 0.4, 0.5), 
              f = c(0.7, 0.2, NA, 0.5, 0.5))

Фактический фрейм данных содержит 60 переменных, но с использованием df1 в качестве примера я хотел бы:

i) Определить, какие столбцы содержат значение (я) ≤0

ii) Для каждого столбца (столбцов), который содержит значение (я) ≤0 создайте новый столбец (столбцы) log(x + 1)

iii) Для каждого столбца, который содержит только значения> 0, создайте новый столбец (столбцы) log(x)

NA значения должны быть сохранены как NA в новых столбцах.

tidyverse решение будет фантастическим c, потому что я нахожу синтаксис более легким для понимания, но ценю любое решение.

1 Ответ

0 голосов
/ 20 марта 2020

Я думаю, что следующее дает вам то, что вам нужно:

# load libraries
library(tidyverse)

# define data
df1 <- tibble(a = c(-0.5, 0, 0.1, 0.5, 0.8),
              b = c(-0.2, NA, 0.3, 0.1, 0.2),
              c = c(0, 0.2, 0.1, 0.3, 0.1),
              d = c(NA, -0.1, 0.7, 0.6, 0.4),
              e = c(0.2, 0.6, NA, 0.4, 0.5), 
              f = c(0.7, 0.2, NA, 0.5, 0.5))

# use mutate all and apply a function that first tests whether all values are
# above 0 or not. Depending on the anser, apply a specific function to the
# column in question
df1 %>% 
  mutate_all(.funs = list(result = function(x) {
    if (all(x > 0, na.rm = T)) log(x) else log(x + 1)
    }))
#> # A tibble: 5 x 12
#>       a     b     c     d     e     f a_result b_result c_result d_result
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
#> 1  -0.5  -0.2   0    NA     0.2   0.7  -0.693   -0.223    0        NA    
#> 2   0    NA     0.2  -0.1   0.6   0.2   0       NA        0.182    -0.105
#> 3   0.1   0.3   0.1   0.7  NA    NA     0.0953   0.262    0.0953    0.531
#> 4   0.5   0.1   0.3   0.6   0.4   0.5   0.405    0.0953   0.262     0.470
#> 5   0.8   0.2   0.1   0.4   0.5   0.5   0.588    0.182    0.0953    0.336
#> # … with 2 more variables: e_result <dbl>, f_result <dbl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...