2017-09-28 12 views
-1

私はRにデータフレームを次ています選択行(dplyr法)

を私はdplyrを使用して異なる列のための行の合計の行のベースをフィルタする:

unqA unqB unqC totA totB totC 
3  5  8  16 12  9 
5  3  2  8  5  4 

私は私のような何かしようとした合計値を持つ行(すべてのUNQ)< = 0.10 *は、合計(すべての合計)

たい:

ユニークなカウントの合計が< =合計の合計の10%の行のみを選択したいとします。

しかし、動作していないか、行がないデータを返すだけです。

提案があります。

答えて

2

このソリューションは、@ SamuelReutherの回答に似たアプローチを採用しています。また、質問の私の理解では、サンプルデータのケースがフィルタを満たすことはないので、フィルタ条件としてTRUEという特別なケースを追加しました。良いです

library(tidyverse) 
df <- read_table("unqA unqB unqC totA totB totC 
3  5  8  16 12  9 
5  3  2  8  5  4 
1  4  3  30 45  25") 

df <- df %>% 
    mutate(sum_unq = rowSums(select(., starts_with("unq"))), 
     sum_tot = rowSums(select(., starts_with("tot")))) 
df 
#> # A tibble: 3 x 8 
#> unqA unqB unqC totA totB totC sum_unq sum_tot 
#> <int> <int> <int> <int> <int> <int> <dbl> <dbl> 
#> 1  3  5  8 16 12  9  16  37 
#> 2  5  3  2  8  5  4  10  17 
#> 3  1  4  3 30 45 25  8  100 
df %>% filter(sum_unq <= 0.1 * sum_tot) 
#> # A tibble: 1 x 8 
#> unqA unqB unqC totA totB totC sum_unq sum_tot 
#> <int> <int> <int> <int> <int> <int> <dbl> <dbl> 
#> 1  1  4  3 30 45 25  8  100 
1

[OK]を、私は(私は右のあなたの質問を理解している場合SHUREない)うまくいけば、それはあなたのために働く、何かを試してみた:

これはあなたの例のデータフレームである:

df <- data.frame(unqA = c(3, 5), 
       unqB = c(5, 3), 
       unqC = c(8, 2), 
       totA = c(16, 8), 
       totB = c(12, 5), 
       totC = c(9, 4)) 

最初のステップIとして必要な追加の列を計算します:

library(dplyr) 
df_ext <- cbind(df, 
    rowSums_unq = df %>% 
    select(matches("unq")) %>% 
    rowSums(), 
    rowSums_tot = df %>% 
    select(matches("tot")) %>% 
    rowSums()) 

をこれが与える:

enter image description here

そして、データフレームをフィルタリングし、最終的に不要な列を削除:私はmutateを使用している以外

df_ext %>% 
    filter(rowSums_unq <= 0.1 * rowSums_tot) %>% 
    select(-rowSums_unq, -rowSums_tot) 
+0

。どうもありがとう – everestial007