2016-09-23 60 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