【问题标题】:Creating a new factor variable from multiple factor variables, all with same levels从多个因子变量创建一个新的因子变量,所有变量都具有相同的水平
【发布时间】:2020-12-08 08:54:25
【问题描述】:

想象一个数据框有多个因子列,具有相同的水平,但不同的条目(可能来自调查)。

f1=factor(sample(1:4,10,replace=T))
f2=factor(sample(1:4,10,replace=T))
f3=factor(sample(1:4,10,replace=T))
df=data.frame(id=1:10,f1,f2,f3)

我想创建一个新的因子变量,如果之前定义的三个因子中的至少两个在级别 1 或 2 中,则该变量的值为 1,如果 f1,@987654323 中的至少两个,则值为 2 @,f3 处于第 3 级,如果 f1,f2,f3 中的至少两个处于第 4 级,则值为 3,否则值为 4(如果存在这种情况?)。

我知道可以通过将 if else 语句与大量逻辑运算符进行非常深的嵌套来做到这一点。但我想知道是否有使用dplyr 函数的更优雅的解决方案?

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    dplyr 中可以指定case_when 中的条件:

    library(dplyr)
    
    df %>%
      rowwise() %>%
      mutate(result = {
        vec <- c_across(f1:f3)
        case_when(sum(vec %in% 1:2) >= 2 ~ 1, 
                  sum(vec == 3) >= 2 ~ 2, 
                  sum(vec == 4) >= 2 ~ 3, 
                  TRUE ~ 4)
      })
    
    #      id f1    f2    f3    result
    #   <int> <fct> <fct> <fct>  <dbl>
    # 1     1 4     2     1          1
    # 2     2 1     1     1          1
    # 3     3 4     2     2          1
    # 4     4 4     3     1          4
    # 5     5 2     2     1          1
    # 6     6 3     4     2          4
    # 7     7 4     2     4          3
    # 8     8 3     2     2          1
    # 9     9 3     1     1          1
    #10    10 2     1     1          1
    

    【讨论】:

    • 谢谢,这很好用!并且很容易理解,因为我了解dplyr 动词。
    【解决方案2】:

    检查这是否适合您:

    f1=factor(sample(1:4,10,replace=T))
    f2=factor(sample(1:4,10,replace=T))
    f3=factor(sample(1:4,10,replace=T))
    df=data.frame(id=1:10,f1,f2,f3)
    
    df$f4 <- factor(apply(df[-1], 1, function(x) { 
       y <- which(table(factor(replace(as.numeric(x), x == "2", 1), c(1:2, 4))) > 1)
       if(length(y) == 0) 4 else y
    }))
    
    df
    #>    id f1 f2 f3 f4
    #> 1   1  1  2  4  1
    #> 2   2  1  3  2  1
    #> 3   3  4  4  2  3
    #> 4   4  1  4  2  1
    #> 5   5  1  1  1  1
    #> 6   6  1  3  3  4
    #> 7   7  3  1  3  4
    #> 8   8  1  3  4  4
    #> 9   9  4  2  1  1
    #> 10 10  2  3  3  4
    

    reprex package (v0.3.0) 于 2020 年 12 月 8 日创建

    【讨论】:

    • 代码可以正常工作,谢谢!但是,对于c(1:2,4) 命令在factor 中的作用,我有点困惑。可能定义级别?如果是这样,为什么要通过从中删除 3 来定义它们,为什么它仍然有效?
    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2015-10-04
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多