【问题标题】:unable to add column with dplyr mutate无法使用 dplyr mutate 添加列
【发布时间】:2017-02-01 19:01:21
【问题描述】:

我目前有这个数据框

    dat = data.frame(time= c("Q1","Q2","Q3"), 
                     measure1 = c(1,2,9   ),
                     measure2 = c(4,5,6   ))
    dat2 = dat %>% gather(key= Metric, value = Value, c(measure1, measure2)) %>% group_by(Metric, time)
dat2 = as.data.frame(dat2)

time   Metric Value
1   Q1 measure1     1
2   Q2 measure1     2
3   Q3 measure1     9
4   Q1 measure2     4
5   Q2 measure2     5
6   Q3 measure2     6

我可以像这样添加这个“测试”列

dat2$test=  ifelse(  dat2$Metric =="measure1" &  dat2$Value >   dat2$Value[ dat2$Metric=="measure2"] ,1,
                               ifelse(  dat2$Metric == "measure2" &   dat2$Value >  dat2$Value[ dat2$Metric=="measure1"] ,1,-1)
                               ) #end ifelse

 time   Metric Value test
1   Q1 measure1     1   -1
2   Q2 measure1     2   -1
3   Q3 measure1     9    1
4   Q1 measure2     4    1
5   Q2 measure2     5    1
6   Q3 measure2     6   -1

但我想像这样使用 dplyr 和变异

dat = data.frame(time= c("Q1","Q2","Q3"), 
                 measure1 = c(1,2,9   ),
                 measure2 = c(4,5,6   ))
dat %>% gather(key= Metric, value = Value, c(measure1, measure2)) %>% group_by(Metric, time) %>%
     mutate(test= ifelse( Metric =="measure1" &  Value > Value[Metric=="measure2"] ,1,
                               ifelse( Metric =="measure2" &  Value > Value[Metric=="measure1"] ,1,-1)
                               ) #end ifelse
                        )#end mutate
dat2 = as.data.frame(dat2)
dat2

但“测试”列全是 NA

 time   Metric Value test
1   Q1 measure1     1   NA
2   Q2 measure1     2   NA
3   Q3 measure1     9   NA
4   Q1 measure2     4   NA
5   Q2 measure2     5   NA
6   Q3 measure2     6   NA

为什么不能使用 mutate 添加列?是否与使用 as.data.frame 并手动添加有关...mutate 无法识别列名?

谢谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    问题在于,当您按Metric 分组时,对于Metricmeasure1Metric == "measure2" 将始终返回 FALSE 和Value[FALSE] == numeric(0) 的组,零长度对象在之后转换为 NA mutate:

    dat %>% 
            gather(key= Metric, value = Value, c(measure1, measure2)) %>% 
            group_by(time) %>%        # <<<<<<<<<<<< here
            mutate(test= ifelse(Metric =="measure1" & Value > Value[Metric=="measure2"] ,1,
                                ifelse(Metric =="measure2" & Value > Value[Metric=="measure1"],1,-1)
                                ) #end ifelse
                  )
    
    # Source: local data frame [6 x 4]
    # Groups: time [3]
    
    #     time   Metric Value  test
    #   <fctr>    <chr> <dbl> <dbl>
    # 1     Q1 measure1     1    -1
    # 2     Q2 measure1     2    -1
    # 3     Q3 measure1     9     1
    # 4     Q1 measure2     4     1
    # 5     Q2 measure2     5     1
    # 6     Q3 measure2     6    -1
    

    通过此示例按指标分组时,您可以更清楚地看到发生了什么:

    dat %>% 
            gather(key= Metric, value = Value, c(measure1, measure2)) %>% 
            group_by(Metric, time) %>%
            mutate(test= Value[Metric == "measure2"])
    
    # Source: local data frame [6 x 4]
    # Groups: Metric, time [6]
    
    #     time   Metric Value  test
    #   <fctr>    <chr> <dbl> <dbl>
    # 1     Q1 measure1     1    NA
    # 2     Q2 measure1     2    NA
    # 3     Q3 measure1     9    NA
    # 4     Q1 measure2     4     4
    # 5     Q2 measure2     5     5
    # 6     Q3 measure2     6     6
    

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 2015-06-19
      • 2014-03-12
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 2016-01-28
      相关资源
      最近更新 更多