Создать и назначить несколько новых столбцов данных в выражении ifelse? - PullRequest
0 голосов
/ 03 мая 2018

Итак, у меня есть фрейм данных my_df следующим образом

my_df <- data.frame(c("0600", "0602", "0603"))

Теперь мне нужно написать оператор ifelse, который вычислит еще 3 переменные и добавит его в новый фрейм данных.

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

Ниже приведен мой код для ifelse оператора.

with(my_df, ifelse(my_df$H == "0600",{d$D <- 1+1 & d$c <- "0600"},
    ifelse(my_df$H == "0602",{d$D <- 2+1 & d$c <- "0602"},
        { d$D <- 3+1 & d$c <- "0603"}
)))

Я могу добавить значения в новый фрейм данных только с одним исполняемым кодом внутри ifloop, т. Е. Если у меня есть только {d$D <- 1+1}, он работает отлично, но не удается, если у меня есть несколько операторов для выполнения.

Мой кадр выходных данных должен быть таким, как показано ниже,

D    C
2    0600
3    0602
4    0603

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Использование базы R

my_df <- data.frame("C" = c("0600", "0602", "0603"))
my_df$D  <- ifelse(my_df$C=="0600",2,ifelse(my_df$C=="0602",3,ifelse(my_df$C=="0603",4,NA)))
0 голосов
/ 03 мая 2018

Использование списка:

# My data frame
my_df <- data.frame(H = c("0600", "0602", "0603"))

# My list to be used as a lookup
my_list <- list("0600" = c(D = 2, C = "0600"),
                "0602" = c(D = 3, C = "0602"),
                "0604" = c(D = 4, C = "0603"))

# Find corresponding values for 'H' 
# Then bind into a data frame
do.call(bind_rows, my_list[my_df$H])

Результат:

# A tibble: 3 x 2
#   D     C    
# <chr> <chr>
# 1 2     0600 
# 2 3     0602 
# 3 4     0603 
0 голосов
/ 03 мая 2018

Ваш синтаксис для ifelse отключен, но я бы порекомендовал использовать case_when из библиотеки dplyr здесь:

library(dplyr)
d$D <- case_when(
    my_df$H == "0600" ~ 1+1,
    my_df$H == "0602" ~ 2+1,
    TRUE ~ 3+1
)

d$c <- case_when(
    my_df$H == "0600" ~ "0600",
    my_df$H == "0602" ~ "0602",
    TRUE ~ "0603"
)

Вы также можете использовать ifelse, но вам понадобятся вложенные вызовы на ifelse, и это, вероятно, не будет хорошо выглядеть или быть очень удобным для обслуживания.

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