【问题标题】:dplyr mutate replace single column values as ifelsedplyr mutate 将单列值替换为 ifelse
【发布时间】:2020-03-05 05:19:45
【问题描述】:

目的:

我有一个包含许多贷款处理数据的数据集(数据集:df)。我需要在“状态”字段中将字符串更改为数字数据。目标是将字符串叙述更改为数值。我希望将此状态用作 lm() 方法中的响应变量。

这是已经完成的:

df$status <- df$status %>% 
  mutate(status = str_replace("Charged On", "100"))
df$status <- df$status %>% 
  mutate(status = str_replace("Charged Off", "200"))
df$status <- df$status %>% 
  mutate(status = str_replace("Fully Paid", "300"))
df$status <- df$status %>% 
  mutate(status = str_replace("Current", "400"))
df$status <- df$status %>% 
  mutate(status = str_replace("In Grace Period", "500"))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我建议在这里使用case_when 来生成一个新的数字列:

    df$status <- case_when(
        df$status == "Charged On" ~ 100,
        df$status == "Charged Off" ~ 200,
        df$status == "Fully Paid" ~ 300,
        df$status == "Current" ~ 400,
        df$status == "In Grace Period" ~ 500,
        TRUE ~ -1
    )
    

    【讨论】:

      【解决方案2】:

      如果您的“状态”列采用因子格式,您可以直接更改因子水平。这是一个模仿您的数据框的虚拟示例:

      df <- data.frame(status = rep(c("Charged On","Charged Off","Fully Paid","Current","Grace Period"),10))
      
              status
      1   Charged On
      2  Charged Off
      3   Fully Paid
      4      Current
      5 Grace Period
      6   Charged On
      ...        ...  
      

      我们可以检查它是一个因子格式:

      > str(df)
      'data.frame':   50 obs. of  1 variable:
       $ status: Factor w/ 5 levels "Charged Off",..: 2 1 4 3 5 2 1 4 3 5 ...
      
      > levels(df$status)
      [1] "Charged Off"  "Charged On"   "Current"      "Fully Paid"   "Grace Period"
      

      现在您可以通过根据因子水平的顺序赋予新的对应值来更改每个因子水平。新值将被整个列替换,最后转换为数字格式:

      levels(df$status) <- c(200,100,400,300,500)
      df$status <- as.numeric(as.character(df$status))
      
      >   head(df)                 
        status
      1    100
      2    200
      3    300
      4    400
      5    500
      6    100
      

      如果您的列不是因子格式,您可以通过以下方式将其转换为因子:

      df$status <- as.factor(df$status)
      

      【讨论】:

      • 确实,您完全正确。我的错误是忘记了这个参数。我相应地编辑我的答案。感谢您注意到我这个错误。
      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多