2016-02-14 50 views
0

條件我有一個數據集,看起來像下面這樣:R:獲得一個列的最小值在分類變量

Attribute estimate  
    Proximity 3.7 
    Proximity 1.54  
    Proximity 0.45  
    Waittime 0.7 
    Waittime 0.76  
    service  0.6 
    Knowledge 0.7 

我想每個屬性的最大值和最小值。我知道我可以使用下面的代碼得到的結果:

min = fit.leb %>% 
#For each Class 
group_by(Attribute) %>% 
filter(estimate == min(estimate)) 

但因爲我有一個只有1個值(即知識)的屬性,這些屬性類型,我想返回的值給我爲0。也就是說,我要像一個結果如下:

Attribute estimate  
    Proximity 0.45  
    Waittime 0.7 
    service  0 
    Knowledge 0 

我不知道如何調整代碼,我必須適應這種額外的條件

回答

1

您可以使用這樣的事情:

df %>% group_by(Attribute) %>% summarise(estimate = ifelse(n() > 1, min(estimate), 0)) 

輸出將是如下:

Source: local data frame [4 x 2] 

    Attribute estimate 
    (fctr) (dbl) 
1 Knowledge  0.00 
2 Proximity  0.45 
3 service  0.00 
4 Waittime  0.70 
1

這裏有一個自定義函數將返回0時傳遞給它的數據的長度爲1,否則返回最小值。

my_min <- function(data) { 
    if (length(data) == 1) { 
    0 
    } else { 
    min(data, na.rm = TRUE) # assuming you want to remove NAs 
    } 
} 

你可以用dpyr::summarize()使用它像這樣:

fit.leb %>% 
    group_by(Attribute) %>% 
    summarize(estimate = my_min(estimate)) 
0

我喜歡Kara Woo的解決方案,但我n你不想定義你自己的功能:

fit.leb <- data.frame(Attribute = c('Proximity', 
            'Proximity', 
            'Proximity',  
            'Waittime', 
            'Waittime',  
            'service', 
            'Knowledge'), 
         estimate = runif(7) 
        ) 


fit.leb %>% group_by(Attribute) %>% 
      mutate(count_by_group = n()) %>% 
      mutate(repeated_values = estimate * as.logical((count_by_group - 1))) %>% 
      summarize(my_min = min(repeated_values)) 
相關問題