2016-12-08 12 views
2

IDのリスト(重複しているものもあります)があり、KEEPという変数があります。私は私が持っている3番目の列を作成したい、それがその特定のカラム別の変数に基づいた変数の最初のインスタンスのみを返します

id <- c(101,101,101,102,102,102,103,103,103,104,104,106,107,108) 
keep <- c("Y",0,0,"Y",0 ,0 ,"Y" ,0 ,0 ,0 ,0 ,0 ,0 ,0) 
df <- data.frame(id, keep) 

ない場合でも、KEEP列で、このインスタンスがある場合、1または0である列を作成したいのですがすべてのIDが一致している場合は、[Keep]列にYがある場合は1です。

これは次のようになります。

> df 

    id keep countkeep 
1 101 Y   1 
2 101 0   1 
3 101 0   1 
4 102 Y   1 
5 102 0   1 
6 102 0   1 
7 103 Y   1 
8 103 0   1 
9 103 0   1 
10 104 0   0 
11 104 0   0 
12 106 0   0 
13 107 0   0 
14 108 0   0 

答えて

8
library(dplyr) 
df %>% group_by(id)%>% mutate(countkeep = ifelse(any(keep=="Y"),1,0)) 

     id keep countkeep 
    <dbl> <fctr>  <dbl> 
1 101  Y   1 
2 101  0   1 
3 101  0   1 
4 102  Y   1 
5 102  0   1 
6 102  0   1 
7 103  Y   1 
8 103  0   1 
9 103  0   1 
10 104  0   0 
11 104  0   0 
12 106  0   0 
13 107  0   0 
14 108  0   0 
+1

の数を、取得します。素晴らしい仕事。 –

+0

ありがとうございましたユーザーがdownvotes、理由も共有してください。本当に役立つでしょう –

4

我々は使用することができますdata.table

library(data.table) 
setDT(df)[, countkeep := +(any(keep=="Y")), id] 
df 
#  id keep countkeep 
# 1: 101 Y   1 
# 2: 101 0   1 
# 3: 101 0   1 
# 4: 102 Y   1 
# 5: 102 0   1 
# 6: 102 0   1 
# 7: 103 Y   1 
# 8: 103 0   1 
# 9: 103 0   1 
#10: 104 0   0 
#11: 104 0   0 
#12: 106 0   0 
#13: 107 0   0 
#14: 108 0   0 

それともbase R

df$countkeep <- with(df, as.integer(ave(keep=="Y", id, FUN = any))) 

かとを使用してtable

transform(df, countkeep = +(id %in% names(na.omit(NA^!table(df)[,"Y"])))) 
3

基本回答が必要な場合は、この回答も有効です。

df$countkeep <- ifelse(df$id %in% df$id[which(df$keep == "Y")], 1, 0) 

> df 
    id keep countkeep 
1 101 Y   1 
2 101 0   1 
3 101 0   1 
4 102 Y   1 
5 102 0   1 
6 102 0   1 
7 103 Y   1 
8 103 0   1 
9 103 0   1 
10 104 0   0 
11 104 0   0 
12 106 0   0 
13 107 0   0 
14 108 0   0 
0

あり、これを行うために、よりエレガントな方法は、おそらくですが、この作品:

df$countkeep <- apply(df,1,function(x){ 
    if(nrow(subset(df,id==x[1] & keep=="Y"))==1) 
    1 
    else 
    0 
}) 

をどのように動作します:

概要:我々はDFの行を見て。キープとしてこの行のIDを有する行、及び「Y」がある場合は、マーク1として有するidと「Y」のインスタンスが存在しない場合、この列のcountkeep 1と、マーク0

  • apply 2番目のパラメータは、 データフレームの行をループし、各行に関数を適用します。
  • subset条件を満たす行を選択します。この場合、 は現在の行と同じIDを持つ行を探し、 の値を "Y"にします。
  • &コンバイン条件
  • nrowは、私があまりにも好き行
  • 私がまさに必要だし、それがdplyrで非常に効率的に行われていた
関連する問題