2016-04-19 6 views
2

を添加I持って次の列では、次のデータフレームdf:私はREPようにしてデータを集計する予め設定された条件に基づいてデータを要約し、(0,1)フラグ

df <- 
REP METRIC BE 
1  A  1 
2  A  0 
3  A  1 
1  B  1 
2  B  1 
3  B  1 
1  C  0 
2  C  1 
3  C  1 

BEMetricABの両方のための1ある場合は、各ユニークREP、次いで1で新しい列BEBOTHを追加し、それ以外の場合は(つまり、それらのいずれかがゼロの場合、BEBOTHがゼロである)0です。

出力は次のようになります。

REP BEBOTH 
    1  1 
    2  0 
    3  1 

私はRでこれを行うことができますどのように?私はifelse声明を使うのにうんざりしましたが、私はその権利を得ていませんでした!

答えて

1

ここであなたが気にすべてが担当者であり、あなたはそれをまとめることができbeboth場合、私は

library(dplyr) 
df <- data_frame(rep = c(1,2,3,1,2,3,1,2,3), 
      metric = c("A", "A", "A", "B", "B", "B", "C", "C", "C"), 
      be  = c(1,0,1,1,1,1,1,1,0)) 

res <- df %>% 
group_by(rep) %>% 
mutate(beboth = ifelse(grep("A|B", metric) && be==0, 0, 1)) 

res 
#Source: local data frame [9 x 4] 
#Groups: rep [3] 
# 
# rep metric be beboth 
# (dbl) (chr) (dbl) (dbl) 
#1  1  A  1  1 
#2  2  A  0  0 
#3  3  A  1  1 
#4  1  B  1  1 
#5  2  B  1  0 
#6  3  B  1  1 
#7  1  C  1  1 
#8  2  C  1  0 
#9  3  C  0  1 

思い付いたものです:

res.summarized <- df %>% 
    group_by(rep) %>% 
    mutate(beboth = ifelse(grep("A|B", metric) && be==0, 0, 1)) %>% 
    summarize(first(beboth)) 

res.summarized 
#Source: local data frame [3 x 2] 
# 
# rep first(beboth) 
# (dbl)   (dbl) 
#1  1    1 
#2  2    0 
#3  3    1 

編集:私はそれを持っている私の答えを更新しましたAとBのみを見てください

+0

と同じロジックを使用して、私はメトリックを指定する方法はあり '0または1のBE'値を持つメトリック 'C'も持っていますifelseステートメントの 'any(be == 0)'の代わりに 'name? ' – Amer

+0

@Amerだから、AとBをビーボーに集約したいだけですか? – AllanT

+0

はい。 BEBOTHは、メトリックAおよびBの「BE」値のみに条件付けされるべきである。コードが正しくない場合は、0または1のBE値を持つMetric Cを持っています。 – Amer

1

基本パッケージを使用して回答:

evaluate_BEBOTH <- function(x){ 
    subset_df <- df[x,] 

    if (sum(subset_df[,'BE']) == 2) 
     return (1) 
    else 
     return (0) 
} 

df$BEBOTH <- ave(1:nrow(df),df$REP,FUN = evaluate_BEBOTH) 

df 
    REP METRIC BE BEBOTH 
1 1  A 1  1 
2 2  A 0  0 
3 3  A 1  1 
4 1  B 1  1 
5 2  B 1  0 
6 3  B 1  1 
2

data.tableを使用できます。 'data.frame'を 'data.table'(setDT(df))に 'REP'でグループ化して、論理条件を取得して+とラップして数値に変換します。

library(data.table) 
setDT(df)[, .(BEBOTH= +(any((METRIC=="A" & BE==1)) & any(METRIC=="B" & BE==1))) , by = REP] 
# REP BEBOTH 
#1: 1  1 
#2: 2  0 
#3: 3  1 

それとも実はdplyr

library(dplyr) 
df %>% 
    group_by(REP) %>% 
    summarise(BEBOTH = +(any(METRIC=="A" & BE==1) & any(METRIC=="B" & BE==1))) 
# REP BEBOTH 
# (int) (int) 
#1  1  1 
#2  2  0 
#3  3  1 
関連する問題