【问题标题】:r: coding dummy variables based-on max value for each monthr:根据每个月的最大值编码虚拟变量
【发布时间】:2019-03-16 14:16:16
【问题描述】:

我想根据df$var1 中每个df$month 的最大值编写一个名为df$dummy 的新变量,其中最大值为1,其他所有值均为0 .查看可重现的数据集:

df<- data.frame(date= seq.Date(from = as.Date('2017-01-01'), by= 7, 
                length.out = 20), var1= rnorm(20, 5, 3))

df$month<- as.numeric(strftime(df$date, "%m"))

我无法概念化函数的条件。在 Excel 中,我将只使用 maxif 函数并指定我的标准。我在下面的尝试不起作用:

df$dummy<- apply(df$var1, MARGIN = 2, 
                 function(x) if_else(max(x) %in% df$month, 1, 0))

它返回这个错误:

Error in apply(df$var1, MARGIN = 2, function(x) if_else(max(x) %in% df$month,  : 
dim(X) must have a positive length

如何编码这个虚拟变量?是否有使用mutate_if 的可行dplyr 解决方案?

【问题讨论】:

  • ifelse(condition, 1, 0) 等价但比as.integer(max(x) %in% df$month) 慢得多。这是因为FALSE/TRUE 被编码为0/1。 (当然是condition。)
  • 另外,if_else 不是基本 R 函数,它是一个包 dplyr。当您使用非基本函数时,通过调用 library() 来启动脚本以加载您需要的包。
  • 错误来自您将函数应用于df$var1 的第二维但df$var1 是一个向量。您不需要apply。我敢打赌max(x) %in% df$month 始终是FALSE,连续变量的最大值不是概率为1 的整数。

标签: r dplyr


【解决方案1】:

dplyr中,关键是使用group_by将数据框按月分隔。然后,var1 == max(var1) 将根据您的需要在每个月内运行。例如:

library(dplyr)
df<- data.frame(date= seq.Date(from = as.Date('2017-01-01'), by= 7, length.out = 20), var1= rnorm(20, 5, 3))
df$month<- as.numeric(strftime(df$date, "%m"))

df <- df %>%
  group_by(month) %>%
  mutate(dummy = as.integer(var1 == max(var1))) %>%
  ungroup

【讨论】:

    【解决方案2】:

    使用data.table 包很容易做到。

    library(data.table)
    
    df<- data.frame(date= seq.Date(from = as.Date('2017-01-01'), by= 7, 
                     length.out = 20), var1= rnorm(20, 5, 3))
    
    df$month<- as.numeric(strftime(df$date, "%m"))
    
    set.DT(df)
    df[,dummy:=ifelse(max(var1)==var1,1,0),month]
    
    ## df
    ##           date      var1 month dummy
    ##  1: 2017-01-01  2.213981     1     0
    ##  2: 2017-01-08  1.768855     1     0
    ##  3: 2017-01-15  4.765936     1     0
    ##  4: 2017-01-22  3.930655     1     0
    ##  5: 2017-01-29  6.548077     1     1
    ##  6: 2017-02-05 -1.489263     2     0
    ##  7: 2017-02-12  4.448080     2     0
    ##  8: 2017-02-19  9.734254     2     1
    ##  9: 2017-02-26  3.322127     2     0
    ## 10: 2017-03-05  8.023423     3     1
    ## 11: 2017-03-12  6.915339     3     0
    ## 12: 2017-03-19  3.563988     3     0
    ## 13: 2017-03-26  4.393971     3     0
    ## 14: 2017-04-02  8.361803     4     0
    ## 15: 2017-04-09  3.636038     4     0
    ## 16: 2017-04-16  3.804143     4     0
    ## 17: 2017-04-23 11.269707     4     1
    ## 18: 2017-04-30  7.024666     4     0
    ## 19: 2017-05-07 10.771904     5     1
    ## 20: 2017-05-14  4.877943     5     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多