【问题标题】:Recoding a range of (string) values in a factor using mutate in dplyr使用 dplyr 中的 mutate 重新编码因子中的(字符串)值范围
【发布时间】:2019-09-01 14:47:06
【问题描述】:

我想重新编码一个因素中的一系列字符串值。在这些级别中,我想将多个因子级别(“601”、“602”、...、“689”)重新编码为单个数值 5001。

如图所示,我尝试使用 mutate 与 case_when 结合使用 dplyr。这些代码适用于单个值,但我不知道如何在不使用行的情况下为一系列字符串值重新编码。

basecensusdata <- basecensusdata %>% 
  mutate(educval,  case_when(
  basecensusdata$P12 == "000" ~ 0,
  basecensusdata$P12 == "010" ~ 100))

我想将范围(“601”到“689”)重新编码为新变量(比如 new_var)下的奇异数值。如何做到这一点?

【问题讨论】:

  • 嗨@mar​​ktacderas,欢迎来到 StackOverflow!如果您可以发布reproducible example,这将有助于其他人也尝试回答。你能做到dput(head(df,10))(其中df是你的数据框的名称,并将10替换为你想要包含的数据框的行数吗?另外,如果你可以显示你想要的输出看起来像这样也很有帮助。

标签: r dplyr case-when


【解决方案1】:

由于它是factor 列,我们可以更改levels

df$new_var <- df$Col
levels(df$new_var)[levels(df$new_var) %in% as.character(601:689)] <- "5001"

【讨论】:

    【解决方案2】:

    您可以创建一系列值来比较并用您想要的数字替换它们。考虑一个示例,您希望使用 5001 将值从 3 更新到 5。

    df <- data.frame(a = factor(1:10), b = letters[1:10])
    df$new_var <- as.character(df$a)
    df$new_var[df$a %in% 3:5] <- 5001
    
    df
    #    a b new_var
    #1   1 a       1
    #2   2 b       2
    #3   3 c    5001
    #4   4 d    5001
    #5   5 e    5001
    #6   6 f       6
    #7   7 g       7
    #8   8 h       8
    #9   9 i       9
    #10 10 j      10
    

    【讨论】:

      【解决方案3】:

      感谢您的建议。在阅读这些之前,我实际上能够找到答案。这是我的解决方案:

      首先,我为代码创建了一个代理变量。 df$factor2_num

      然后在我的“case_when”语句中,我输入了以下内容:

      if((...case_when... (df$factor_num >=601) & (df$factor_num

      效果很好。它与这里的所有解决方案一致。谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-02
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        相关资源
        最近更新 更多