2017-11-26 12 views
1

に計算これは、私のデータは、私はグループによってデータをフィルタリングする https://www.dropbox.com/s/1n9hpyhcniaghh5/table.csv?dl=0GROUP_BYは、フィルタおよびR

 LABEL DATE TAU TYPE x y z 
1  A 1 2 1 0.75 7 16 
2  A 1 2 0 0.41 5 18 
3  A 1 2 1 0.39 6 14 
4  A 2 3 0 0.65 5 14 
5  A 2 3 1 0.55 7 19 
6  A 2 3 1 0.69 5 19 
7  A 2 3 0 0.66 7 19 
8  A 3 1 0 0.38 8 15 
9  A 3 1 0 0.02 5 16 
10  A 3 1 0 0.71 8 13 
11  B 1 2 1 0.25 9 18 
12  B 1 2 0 0.06 8 20 
13  B 1 2 1 0.60 8 20 
14  B 1 2 0 0.56 6 13 
15  B 1 3 1 0.50 8 19 
16  B 1 3 0 0.04 8 16 
17  B 2 1 1 0.04 5 15 
18  B 2 1 1 0.75 5 13 
19  B 2 1 0 0.44 8 18 
20  B 2 1 1 0.52 9 13 

(、お知らせくださいできない場合) あなたはデータがこのリンクを形成し得ることができます設定されています複数の条件でおよび条件は 大きな

  • 1より、各タイプの行の数が等しくなければならない必要があり

    • 基によって型変数の各タイプ(0,1)の行の数である (例:タイプ1の行数は...私は何回もしようとした

    各グループのタイプ0)の行数に等しく、そして最後に、私はこのコードと、この出力を得る

    table %>% group_by(label,date,tau,type) %>% filter(n()>1) %>% filter(length(type==1)==length(type==0)) 
    
    # A tibble: 16 x 7 
    # Groups: label, date, tau, type [7] 
         LABEL DATE TAU TYPE x y z 
        <fctr> <int> <int> <int> <dbl> <int> <int> 
    1  A  1  2  1 0.75 7 16 
    2  A  1  2  1 0.39 6 14 
    3  A  2  3  0 0.65 5 14 
    4  A  2  3  1 0.55 7 19 
    5  A  2  3  1 0.69 5 19 
    6  A  2  3  0 0.66 7 19 
    7  A  3  1  0 0.38 8 15 
    8  A  3  1  0 0.02 5 16 
    9  A  3  1  0 0.71 8 13 
    10  B  1  2  1 0.25 9 18 
    11  B  1  2  0 0.06 8 20 
    12  B  1  2  1 0.60 8 20 
    13  B  1  2  0 0.56 6 13 
    14  B  2  1  1 0.04 5 15 
    15  B  2  1  1 0.75 5 13 
    16  B  2  1  1 0.52 9 13 
    

    私はこのコードでこの出力について混乱しました。私はすでに条件を満たしていないデータを取り除く1 しかし

    私が望む結果内でまだ条件2を満たしていなかったデータは、すぐ下

     LABEL DATE TAU TYPE x y z 
        <fctr> <int> <int> <int> <dbl> <int> <int> 
    3  A  2  3  0 0.65 5 14 
    4  A  2  3  1 0.55 7 19 
    5  A  2  3  1 0.69 5 19 
    6  A  2  3  0 0.66 7 19 
    10  B  1  2  1 0.25 9 18 
    11  B  1  2  0 0.06 8 20 
    12  B  1  2  1 0.60 8 20 
    13  B  1  2  0 0.56 6 13 
    

    のようなものですそして、私は各行の下の関数で値を計算したい場合、どのようにコード化できますか? mutate()の関数を使うだけです。

    f(x,y,z) = 2 * x + y - z/3  if TYPE == 1 
    f(x,y,z) = 4 * x - y/2 + z/3 if TYPE == 0 
    

    誰もが私を助けることができると私はあなたの助けに感謝しています願っています!他の情報を提供する必要がある場合は、私に知らせてください〜

  • 答えて

    0
    # example dataset 
    df = read.table(text = " 
    LABEL DATE TAU TYPE x y z 
    1  A 1 2 1 0.75 7 16 
    2  A 1 2 0 0.41 5 18 
    3  A 1 2 1 0.39 6 14 
    4  A 2 3 0 0.65 5 14 
    5  A 2 3 1 0.55 7 19 
    6  A 2 3 1 0.69 5 19 
    7  A 2 3 0 0.66 7 19 
    8  A 3 1 0 0.38 8 15 
    9  A 3 1 0 0.02 5 16 
    10  A 3 1 0 0.71 8 13 
    11  B 1 2 1 0.25 9 18 
    12  B 1 2 0 0.06 8 20 
    13  B 1 2 1 0.60 8 20 
    14  B 1 2 0 0.56 6 13 
    15  B 1 3 1 0.50 8 19 
    16  B 1 3 0 0.04 8 16 
    17  B 2 1 1 0.04 5 15 
    18  B 2 1 1 0.75 5 13 
    19  B 2 1 0 0.44 8 18 
    20  B 2 1 1 0.52 9 13 
    ", header=T, stringsAsFactors=F) 
    
    library(dplyr) 
    library(tidyr) 
    
    # function to use for each row 
    # (assumes that type can be only 1 or 0) 
    f = function(t,x,y,z) { ifelse(t == 1, 
               2 * x + y - z/3, 
               4 * x - y/2 + z/3) } 
    
    df %>% 
        count(LABEL, DATE, TAU, TYPE) %>%    # count rows for each group (based on those combinations) 
        filter(n > 1) %>%        # keep groups with multiple rows 
        mutate(TYPE = paste0("TYPE_",TYPE)) %>%   # update variable 
        spread(TYPE, n, fill = 0) %>%     # reshape data 
        filter(TYPE_0 == TYPE_1) %>%      # keep groups with equal number of rows for type 0 and 1 
        select(LABEL, DATE, TAU) %>%      # keep variables/groups of interest 
        inner_join(df, by=c("LABEL", "DATE", "TAU")) %>% # join back info 
        mutate(f_value = f(TYPE,x,y,z))     # apply function 
    
    # # A tibble: 8 x 8 
    # LABEL DATE TAU TYPE  x  y  z f_value 
    # <chr> <int> <int> <int> <dbl> <int> <int>  <dbl> 
    # 1  A  2  3  0 0.65  5 14 4.76666667 
    # 2  A  2  3  1 0.55  7 19 1.76666667 
    # 3  A  2  3  1 0.69  5 19 0.04666667 
    # 4  A  2  3  0 0.66  7 19 5.47333333 
    # 5  B  1  2  1 0.25  9 18 3.50000000 
    # 6  B  1  2  0 0.06  8 20 2.90666667 
    # 7  B  1  2  1 0.60  8 20 2.53333333 
    # 8  B  1  2  0 0.56  6 13 3.57333333 
    
    関連する問題