すべての列の合計への寄与に基づいて、データフレームから列を削除しようとしています。
1x5データフレームの例は次のようになります(同様の方法で5x1データフレームから行を削除してから転置することも可能だと思います)。値の合計が100になると仮定します。
df <- data.frame(V1 = 5, V2 = 10, V3 = 20, V4 = 40, V5 = 25)
V1 V2 V3 V4 V5
5 10 20 40 25
ここで、たとえばすべての列の合計の少なくとも80%に最も貢献する列を保持したいと思います。
だから私が達成したいのは:
V3 V4 V5
20 40 25
これを行うためのエレガントな方法はありますか?
前もって感謝します!
使用できます tidyverse
library(tidyr)
library(dplyr)
pivot_longer(df, everything()) %>%
arrange(desc(value)) %>%
filter(!lag(cumsum(value) > 80, default = FALSE)) %>%
deframe
# V4 V5 V3
#40 25 20
または同じ順序で必要な場合
pivot_longer(df, everything()) %>%
arrange(desc(value)) %>%
filter(!lag(cumsum(value) > 80, default = FALSE)) %>%
arrange(match(name, names(df))) %>%
mutate(rn = 1) %>%
pivot_wider(names_from = name, values_from = value) %>%
select(-rn)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加