2017-11-26 3 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보다 유형별 행의 수와 동일해야한다

    • 그룹 별 TYPE 변수의 각 유형 (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