2016-05-25 2 views
2

に基づいて、私は、重複レコードを持ついくつかのデータを持っており、そのうちのいくつかは、(markrecovは、一度だけbandあたりのあるべきrecapが数倍存在することができる)があってはなりません。ある列(variable=="mark")の特定の値に基づいて一意の観測値(band)を選択し、残りのデータを"recap""recov"にします。特定の観測別のを探していたときに個別(dplyr)うまく働いていない - ユニークな観測を基準

uniq <- df %>%group_by(band) %>% distinct(variable=="mark") 

私は、それがうまく機能していないことが判明:列variable=="mark"が、これは私のコードであるとき

私は一意のレコードを選択し、バンドによってグループに、私のデータをdyplrを使用しましたvariable=="recap"から値を削除されている(例:band=113749924において、1993からリキャップ値が欠落している、band=113728509で同じ場合欠落リキャップ値がある)

これはデータの例である:

終わり
structure(list(band = c(113728501L, 113728502L, 113728503L, 113728504L, 
113728505L, 113728505L, 113728506L, 113728506L, 113728507L, 113728508L, 
113728509L, 113728509L, 113728509L, 113728509L, 113728510L, 113728510L, 
113729709L, 113729709L, 113729709L, 113729710L, 113729711L, 113729712L, 
113729713L, 113729714L, 113729715L, 113729716L, 113729717L, 113729718L, 
113729719L, 113729720L, 113729720L, 113729721L, 113729722L, 113729723L, 
113729724L, 113729725L, 113729726L, 113729727L, 113729728L, 113729729L, 
113729730L, 113729731L, 113729732L, 113729733L, 113729733L, 113729733L, 
113729734L, 113729735L, 113729735L, 113729735L, 113729914L, 113729914L, 
113729914L, 113729914L, 113729915L, 113729916L, 113729917L, 113729918L, 
113729919L, 113729920L, 113729921L, 113729922L, 113729923L, 113729924L, 
113729925L, 113729926L, 113729927L, 113729928L, 113729929L, 113749923L, 
113749924L, 113749924L, 113749924L), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 3L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 1L, 3L, 
2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 3L, 2L), .Label = c("mark", "recap", 
"recov"), class = "factor"), year = c(1994L, 1994L, 1994L, 1994L, 
1994L, 2012L, 1994L, 1999L, 1994L, 1994L, 1994L, 1994L, 2002L, 
2003L, 1994L, 1996L, 1994L, 2002L, 1998L, 1994L, 1994L, 1994L, 
1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1995L, 
1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 
1994L, 1994L, 1994L, 1994L, 2002L, 2001L, 1994L, 1994L, 1999L, 
1998L, 1994L, 1994L, 1999L, 2005L, 1994L, 1994L, 1994L, 1994L, 
1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 
1994L, 1994L, 1991L, 1991L, 1994L, 1993L)), .Names = c("band", 
"variable", "year"), class = "data.frame", row.names = c(NA, 
-73L)) 

私は(113749924のための一例)のようなものを持っているしたいと思います:

band  year variable 
113749924 1991 mark 
113749924 1993 recap 
113749924 1994 recov 

あなたは間違っているものを見つけるために私を助けるか、多分私に代替コードを提案してくださいもらえますか?

ありがとうございます!

+0

「dput」の出力としてインラインでデータをポストすると、ヘルプを表示するのに最適です。外部リンクは役に立ちません。 – Gopala

+0

あなたの助言に感謝します!私は今日何か新しいことを学びました – MSS

+1

あなたは 'distinct(df)'を試すことができます。あるいは、 'group_by'を使うと、' slice'を使って複製セットの最初の行だけを得ることができます。 – Gopala

答えて

1

一つのオプションは、「変数が」「マークではありませんfilter EDデータセットで(bind_rows)、group_by「バンド」になる「変数」「マーク」ですfilter行、distinct行を取得し、それを結合するであろう'

df %>% 
group_by(band) %>% 
filter(variable=="mark") %>% 
ungroup() %>% 
distinct() %>% 
bind_rows(., filter(df, variable!="mark")) %>% 
arrange(band) %>% 
data.frame 
     band variable year 
1 113728501  mark 1994 
2 113728502  mark 1994 
3 113728503  mark 1994 
4 113728504  mark 1994 
5 113728505  mark 1994 
6 113728505 recov 2012 
7 113728506  mark 1994 
8 113728506 recap 1999 
9 113728507  mark 1994 
10 113728508  mark 1994 
11 113728509  mark 1994 ###only one mark. 
12 113728509 recap 2002 
13 113728509 recap 2003 
14 113728510  mark 1994 
15 113728510 recap 1996 
16 113729709  mark 1994 
17 113729709 recov 2002 
18 113729709 recap 1998 
19 113729710  mark 1994 
20 113729711  mark 1994 
21 113729712  mark 1994 
22 113729713  mark 1994 
23 113729714  mark 1994 
24 113729715  mark 1994 
25 113729716  mark 1994 
26 113729717  mark 1994 
27 113729718  mark 1994 
28 113729719  mark 1994 
29 113729720  mark 1994 
30 113729720 recov 1995 
31 113729721  mark 1994 
32 113729722  mark 1994 
33 113729723  mark 1994 
34 113729724  mark 1994 
35 113729725  mark 1994 
36 113729726  mark 1994 
37 113729727  mark 1994 
38 113729728  mark 1994 
39 113729729  mark 1994 
40 113729730  mark 1994 
41 113729731  mark 1994 
42 113729732  mark 1994 
43 113729733  mark 1994 
44 113729733 recov 2002 
45 113729733 recap 2001 
46 113729734  mark 1994 
47 113729735  mark 1994 
48 113729735 recov 1999 
49 113729735 recap 1998 
50 113729914  mark 1994 
51 113729914 recap 1999 
52 113729914 recap 2005 
53 113729915  mark 1994 
54 113729916  mark 1994 
55 113729917  mark 1994 
56 113729918  mark 1994 
57 113729919  mark 1994 
58 113729920  mark 1994 
59 113729921  mark 1994 
60 113729922  mark 1994 
61 113729923  mark 1994 
62 113729924  mark 1994 
63 113729925  mark 1994 
64 113729926  mark 1994 
65 113729927  mark 1994 
66 113729928  mark 1994 
67 113729929  mark 1994 
68 113749923  mark 1991 
69 113749924  mark 1991 
70 113749924 recov 1994 
71 113749924 recap 1993 

それとも別のオプションそれを否定、「マーク」は両方とも「バンド」group_byになる、と「変数」、そしてrow_number()が1より大きいと「変数」である論理条件を作成します(!)、filterとなります。

df %>% 
    group_by(band, variable) %>% 
    filter(!(row_number() >1 & variable =="mark")) 
+0

申し訳ありません私は十分にはっきりしていないと思います(私は既に私の投稿でそれを変更しました)、私はまた、 "recov"と "要約"に関するデータの残りの部分を保持したいと同時に、 "マーク"(これは二重であることもあります) – MSS

+2

' group_by'と 'ungroup' – alistaire

関連する問題