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

Контекст проблемы: возвращаемый список требует chr (символ). Создана функция fun_grade () для условного выбора значения цифры c (в виде символа) для возврата и обновления внутри фрейма данных. Список был возвращен в поле данных df_credit_status $ grade. Возможно, мне нужно было привести к as.character, или есть лучший метод функции для изменения столбца символов?

list returned need simple chr

fun_grade <- function(grade) {
  if (grade == "A") return("100")
  if (grade == "B") return("80")
  if (grade == "C") return("60")
  if (grade == "D") return("40")
  if (grade == "D") return("20")
  if (grade == "F") return("10")
  return
}
df_credit_status$grade <- sapply(df_credit_status$grade, FUN=fun_grade)

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

ОК, я смоделировал фрейм данных:

df_credit_status <- data.frame(
  grade = sample(
    c("A", "B", "C", "D", "E", "F"), 
    size = 200, 
    replace = TRUE)
)

И изменил ваш код:

fun_grade <- function(grade) {as
  if (grade == "A") { 
    return("100")
  } else if (grade == "B") {
    return("80")
  } else if (grade == "C") {
    return("60")
  } else if (grade == "D") {
    return("40")
  } else if (grade == "E") {
    return("20")
  } else if (grade == "F") {
    return("10")
  }
}

df_credit_status$equiv_grade <- sapply(df_credit_status$grade, 
                                       FUN = fun_grade)

И получил:

> head(df_credit_status)
  grade equiv_grade
1     F          10
2     D          40
3     F          10
4     F          10
5     C          60
6     C          60

Лично я буду сделать это с помощью библиотек tidyverse:

library(tidyverse)

df_credit_status <- data.frame(
  grade = sample(
    c("A", "B", "C", "D", "E", "F"), 
    size = 200, 
    replace = TRUE)
)


df_credit_status <- df_credit_status %>% 
  mutate(
    equiv_grade = case_when(
      grade == "A" ~ "100",
      grade == "B" ~ "80",
      grade == "C" ~ "60",
      grade == "D" ~ "40",
      grade == "E" ~ "20",
      grade == "F" ~ "10"
    )
  )
# change the equivalencies above to numbers if you need that

Я использую второй столбец, поэтому информация из оригинала не теряется.

HTH

3 голосов
/ 10 марта 2020

Вместо выполнения нескольких условий if используйте именованный вектор для замены значений.

setNames(c(100, 80, 60, 40, 20, 10),
              LETTERS[1:6])[as.character(df_credit_status$grade)]

Используя небольшой воспроизводимый пример

set.seed(24)
v1 <- sample(LETTERS[1:6], 25, replace = TRUE)
setNames(c(100, 80, 60, 40, 20, 10), LETTERS[1:6])[v1]
#   C   B   C   E   B   F   B   A   D   A   A   E   E   A   E   E   D   E   B   A   D   C   E   B   A 
#  60  80  60  20  80  10  80 100  40 100 100  20  20 100  20  20  40  20  80 100  40  60  20  80 100 

Кроме того, if/else не векторизован, поэтому требуется либо ifelse/if_else/case_when (что в любом случае не будет столь эффективным)

...