2017-08-30 4 views
-2

列に何百ものレベルがあり、それらのすべてが実際に値を追加するわけではありません。つまり、レベルの約60%が<の80%を占めます(データフレームでは何度も発生しません)結果に影響を与えないことも期待されます。目的は、80%以上寄与しないレベルを排除することです。 誰かを助けることができますか?事前に感謝します寄与の少ない要素を削除する

+0

downvoteへのok - 修正を加えるためにコメントを追加できますか?ありがとうございました。 – emeralddove

+0

あなたは貢献して何を意味しますか?統計テストを使用していますか?どれ?生殖可能な例がありますか? –

+0

まず、除外したいレベルを特定/指定する合理的な方法を見つける必要があります。統計的なテストに基づいて、または人気に基づいて(各行が非常に少ないレベル)に行うことができます。次に、それらを削除したいか(行全体を削除するか)、別のレベル(例:「休憩」)に再コードするかどうかを考える必要があります。 – AntoniosK

答えて

1

ここでは、データセット(行)の80%未満を占める値をスポットし、新しい値を使用してそれらをグループ化する単純なプロセスがあります。このプロセスでは、因子列ではなく文字列が使用されます。

library(dplyr) 

# example dataset 
dt = data.frame(type = c("A","A","A","B","B","B","c","D"), 
       value = 1:8, stringsAsFactors = F) 

dt 

# type value 
# 1 A  1 
# 2 A  2 
# 3 A  3 
# 4 B  4 
# 5 B  5 
# 6 B  6 
# 7 c  7 
# 8 D  8 

# count number of rows for each type 
dt %>% count(type) 

# # A tibble: 4 x 2 
# type  n 
# <chr> <int> 
# 1  A  3 
# 2  B  3 
# 3  c  1 
# 4  D  1 

# add cumulative percentages 
dt %>% 
    count(type) %>% 
    mutate(Prc = n/sum(n), 
     CumPrc = cumsum(Prc)) 

# # A tibble: 4 x 4 
# type  n Prc CumPrc 
# <chr> <int> <dbl> <dbl> 
# 1  A  3 0.375 0.375 
# 2  B  3 0.375 0.750 
# 3  c  1 0.125 0.875 
# 4  D  1 0.125 1.000 

# pick the types you want to group together 
dt %>% 
    count(type) %>% 
    mutate(Prc = n/sum(n), 
     CumPrc = cumsum(Prc)) %>% 
    filter(CumPrc > 0.80) %>% 
    pull(type) -> types_to_group 

# group them 
dt %>% mutate(type_upd = ifelse(type %in% types_to_group, "Rest", type)) 

# type value type_upd 
# 1 A  1  A 
# 2 A  2  A 
# 3 A  3  A 
# 4 B  4  B 
# 5 B  5  B 
# 6 B  6  B 
# 7 c  7  Rest 
# 8 D  8  Rest 
+0

ありがとうAntoniosK - 質問を理解するにはもちろん認知負荷があります:) – emeralddove

関連する問題