2017-08-30 52 views
0

背景:,我試圖來過濾,但不正確的分組都使其難以的R - dplyr總結和清潔用多組數據幀

我大的數據幀。想象一下,你有一個具有分層類別的雜貨店的銷售信息。香蕉出現3次:2次爲「水果」,1次爲「肉」。我知道實際上發生了「肉類」銷售,所以我不想擺脫它,但它弄亂了我過濾的彙總數據(例如,我只想保留具有3個或更多實例的分組,但香蕉會消失)。

重現性實施例

x1 <- c('a','a','a','b','b','b') 
x2 <- c(1,1,4,5,2,2) 
x3 <- c(10,11,12,13,14,15) 
df = data.frame(x1,x2,x3) 

summarized = df %>% 
    group_by(x1, x2) %>% 
    summarize(Avg = mean(x3), 
      Times = n()) 

創建:

 x1 x2 Avg Times 
1  a  1 10.5  2 
2  a  4 12.0  1 
3  b  2 14.5  2 
4  b  5 13.0  1 

分組(A,1)發生超過(A,4),所以我知道(A,1)是正確的( (b,2)與(b,5)相同)。我在尋找我的數據幀成爲:

 x1 x2 Avg Times 
1  a  1 11  3 
2  b  2 14  3 

x2重要的是我保持,因爲我的條件格式是基於(即,如果X2 == 1 & AVG < 10再落別人保持)。

我最好試圖做平均/計數分開,然後加上最大的X2?提前致謝!

+0

試着給出一致的例子。雖然描述你用「香蕉」,「肉」來解釋它,但在你可重複的例子中,我沒有找到它們。 –

+0

我注意到你迄今在SO上提出的6個問題沒有接受任何答案。請考慮接受解決您的疑問的答案。 –

回答

0

更新

which.max默認選擇第一個最大的,所以在情況下,如果我們需要選擇最大值的最後一個條目,我們只需要rev erse table條目,然後選擇最大值。

df %>% 
    group_by(x1) %>% 
    summarise(x2 = names(which.max(rev(table(x2)))), 
      x3 = mean(x3), 
      Times = n()) 

原來的答案

我們可以group_byx1並選擇x2發生了最大時間,計算平均值和計數行(n()),每個組的數量。

library(dplyr) 
df %>% 
    group_by(x1) %>% 
    summarise(x2 = names(which.max(table(x2))), 
      x3 = mean(x3), 
      Times = n()) 


#  x1 x2 x3 Times 
# <fctr> <chr> <dbl> <int> 
#1  a  1 11  3 
#2  b  2 14  3 
+0

感謝您的幫助!什麼是.max處理關係的默認方式?即當我在最後添加另一行(a,4)時,此函數仍然在彙總表中給出(a,2)。如果有一條平行線(2條(a,2)和2條(a,4條)),有沒有辦法將它切換到最後一排? – CoolGuyHasChillDay

+0

@CoolGuyHasChillDay我已經更新了相應的答案。請看一看。 –

0

如果你知道每個x1組中最常見的x2是正確的,你可以這樣做:

correct_cats = df %>% 
    group_by(x1) %>% 
    count(x2) %>% 
    # Find most common x2 
    top_n(1, n) %>% 
    select(-n) 

df = df %>% 
    # Drop current x2 
    select(-x2) %>% 
    # Merge in corrected x2 
    left_join(correct_cats, by = 'x1') 

summarized = df %>% 
    group_by(x1, x2) %>% 
    summarize(Avg = mean(x3), 
       Times = n())