【问题标题】:Create a numerical column in r using factor column使用因子列在 r 中创建一个数值列
【发布时间】:2020-03-31 16:43:47
【问题描述】:

我在 R 中有一个现有数据集,我希望在其中使用现有列构建一个新的数值列。它具有“远”、“近”、“开”等因素,我试图在“dplyr”(或类似的)中使用“变异”来创建一个具有相应数字的新列(远 = 3,近 = 2 , 开 = 1)。抱歉没有代码,我是这个论坛的新手。谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    首先是一个示例数据集。

    set.seed(1234)
    x <- factor(sample(c("Far", "Near", "On"), 10, TRUE))
    

    首先,按照所需顺序重新编码因子及其水平。

    codes <- c("Far" = 3, "Near" = 2, "On" = 1)
    x <- factor(as.character(x), levels = names(sort(codes)))
    

    现在,由于因子在内部被编码为连续整数,所以一个简单的强制就足够了。

    as.integer(x)
    #[1] 2 2 3 1 3 3 2 2 1 2
    

    另一种选择是

    attributes(x) <- NULL
    x
    #[1] 2 2 3 1 3 3 2 2 1 2
    

    【讨论】:

    • 这不控制哪些数字分配给哪些因素。正如所写,它将“Far”编码为“1”,将“On”编码为“3”。
    • @BrianStamper 你是对的,我没有注意到问题中的顺序。现已更正,请参阅编辑。
    【解决方案2】:

    您可以简单地设置因子列的级别

    > # Initial data
    > val
    [1] Far  Near On   Far  Near
    Levels: Far Near On
    
    > # Check the levels
    > levels(val)
    [1] "Far"  "Near" "On"  
    
    > # Set levels to required values
    > levels(val) <- c(3, 2, 1)
    
    > # Result
    > val
    [1] 3 2 1 3 2
    Levels: 3 2 1
    

    【讨论】:

    • 谢谢!这很有效,而且很棒。我真的很感激。
    • 如果您发现答案有帮助,请考虑accepting他们并投票。
    • 谢谢!我刚刚接受了答案。不幸的是,我无法投票,因为我的帐户似乎太新了。
    • 但这不会创建实际问题中所述的“数字”列。它只是修改因子列的级别,生成的对象仍然作为带有数字级别的“因子”。如果这是您想要的,请修改问题。否则,这不能回答问题。
    • 如果您想对这个新的val 列(不是数字)执行数学运算,请谨慎使用此解决方案。尝试做val + 1。你会得到 NA NA NA。
    【解决方案3】:

    另一个选项是unclass 因子并从 4 中减去结果,因为因子水平从 1L 开始。

    x <- factor(c("Far","Near","On"))
    4 - c(unclass(x))
    # [1] 3 2 1
    

    或者为了保留levels属性,省略c。

    4 - unclass(x) -> y
    class(y)
    # [1] "numeric"
    

    【讨论】:

    • 您好,非常感谢您,但不幸的是,这不起作用。不过我能找到答案,所以谢谢你回答我的问题!
    • “没有工作”是什么意思?您的问题可能需要进一步澄清。
    • 嗨,爱德华 - 不幸的是,我认为这只是我自己的愚蠢。我不确定如何将其应用于我的数据 - 但是我能够找到我的问题的答案。
    【解决方案4】:

    dplyr 函数 case_when 可以在 mutate 内工作:

    your_data <- your_data %>%
      mutate(num = case_when(your_factor == "Far" ~ 3,
                             your_factor == "Near" ~ 2,                             
                             your_factor == "On" ~ 1))
    

    编辑,演示这确实有效:

    > your_data <- data.frame(your_factor = sample(c("Far", "Near", "On"), 10, TRUE))
    > glimpse(your_data)
    Observations: 10
    Variables: 1
    $ your_factor <fct> On, Far, Near, Far, Near, Near, On, On, On, On
    > your_data <- your_data %>%
      +   mutate(num = case_when(your_factor == "Far" ~ 3,
      +                          your_factor == "Near" ~ 2,                             
      +                          your_factor == "On" ~ 1))
    > glimpse(your_data)
    Observations: 10
    Variables: 2
    $ your_factor <fct> On, Far, Near, Far, Near, Near, On, On, On, On
    $ num         <dbl> 1, 3, 2, 3, 2, 2, 1, 1, 1, 1
    > 
    

    【讨论】:

    • 感谢您的评论 - 不幸的是,我已经尝试了几种不同的方法,它只是创建了一个包含“NA”的新列。我确实解决了这个问题,但还是谢谢你!
    • 我尝试用一​​些数据对此进行测试,并且成功了。如果不展示您尝试过的内容,就很难说出为什么它不适合您。
    • 道歉 - 很难解释我的数据发生了什么。幸运的是,我能够解决这个问题,但是如果您愿意,我可以分解我尝试过的内容以及遇到的错误。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2019-12-14
    • 2022-11-08
    • 2020-07-09
    相关资源
    最近更新 更多