2016-09-23 29 views
1

目前,我有这个数据帧无法添加与dplyr列变异

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不能识别列名称?

谢谢。

回答

3

的问题就在于,当你按Metric,团体那里Metricmeasure1Metric == "measure2"将始终返回FALSE,并Value[FALSE] == numeric(0),零个长度对象的mutate后转化为NA:

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