【问题标题】:create dummy variable based on values of another variable?根据另一个变量的值创建虚拟变量?
【发布时间】:2020-06-10 03:05:50
【问题描述】:

我有一个包含以下结构的多列的大型数据集

    A    B      
1.  1.   D1  
2.  1.   D2
3.  2    D2
4.  3.   D1
5.  3.   D2

我正在尝试根据 A 列中的独特观察结果创建一个新数据框,其中虚拟变量“Dummy”编码为 1=D1, 2=D2, 3=both,如下所示:

    A.  Dummy
1.  1.   3
2.  2.   2
3.  3.   3

知道我该怎么做吗?

【问题讨论】:

    标签: r function loops dataframe


    【解决方案1】:

    您可以使用aggregate

    aggregate(B ~ A, df, function(x) if(all(x == "D1")) 1 else if(all(x == "D2")) 2 else 3)
    
    #   A B
    # 1 1 3
    # 2 2 2
    # 3 3 3
    

    【讨论】:

      【解决方案2】:

      另一种可能的解决方案:

      df %>% 
        group_by(A) %>% 
        summarise(B = paste0(B, collapse = "_")) %>% 
        mutate(Dummy = case_when(
          B == "D1" ~ 1,
          B == "D2" ~ 2,
          B == "D1_D2" |  B == "D2_D1" ~ 3,
          TRUE ~ NA_real_
        )) %>% 
        select(-B)
      

      结果

      # A tibble: 3 x 2
            A Dummy
        <dbl> <dbl>
      1     1     3
      2     2     2
      3     3     3
      

      【讨论】:

        【解决方案3】:

        这是dplyr 的选项。按'A'分组后,if不同元素个数大于1,返回3或else使用命名向量匹配'B'的first元素

        library(dplyr)
        df1 %>% 
           group_by(A) %>% 
           summarise(Dummy = if(n_distinct(B) > 1) 3L else 
               setNames(1:2, c("D1", "D2"))[first(B)])
        # A tibble: 3 x 2
        #      A Dummy
        #* <dbl> <int>
        #1     1     3
        #2     2     2
        #3     3     3
        

        数据

        df1 <- structure(list(A = c(1, 1, 2, 3, 3), B = c("D1", "D2", "D2", 
        "D1", "D2")), class = "data.frame", row.names = c("1.", "2.", 
        "3.", "4.", "5."))
        

        【讨论】:

          猜你喜欢
          • 2019-07-31
          • 2016-10-21
          • 1970-01-01
          • 1970-01-01
          • 2016-12-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          相关资源
          最近更新 更多