

A.sub <\- A %>% dplyr::filter(kegg_compound != dup_u.df[1,]) %>%  
dplyr::filter(kegg_compound != dup_u.df[2,]) %>%  
dplyr::filter(kegg_compound != dup_u.df[3,]) %>%  
dplyr::filter(kegg_compound != dup_u.df[4,]) %>%  
dplyr::filter(kegg_compound != dup_u.df[5,])

Aはデーターフレームで、重複した遺伝子名が格納されたkegg_compound列があります。この列から、重複した遺伝子名を取りだすコードを書きたいのですが、うまくかけません。  
dup_u.dfは、Aのkegg_compound列で重複した遺伝子名を格納したデーターフレームです。  
A1 <\- A[duplicated(A$kegg_compound), ] #A1には重複した最初の行が残る。  
dup <\- A1  
dup_u <\- unique(dup$kegg_compound)  
dup_u.df <\- data.frame(dup_u)  
この例では、重複した遺伝子は、5個しかなかったため、一つずつ書き出したプログラムでも目的は達成されます。  
もっと、重複した遺伝子が増えた場合、そもそも重複した遺伝子の数がわからない場合にも、対応できるプログラムにしたいと思っています。  
Aは、文字型、ファクター型、int型が混在するデーターフレームです。  
for文で以下のように書くと、ファクター型が強制的にint型に変換されてしまいます。  
for(i in 1:nrow(dup_u.df)) {  
# B[i,] <\- A[A$kegg_compound == dup_u.df[i,1], ] }

ご教授、よろしくお願いいたします。


CC BY-SA 3.0
2017-06-01T11:31:31.120
35193
2017-06-01T13:00:31.323
23501
question
r
Rでデーターフレームから重複した行を全て取りだすコード


「重複した行を取り出す」を，「重複が存在する行は(1行も残さず)削除する」なのかなと判断したのですが，あってますでしょうか．

_dplyr_ を使っているようでしたので，以下のような感じではどうでしょうか．あと説明の都合上適当にサンプルを作ってます:

[code]

    library(dplyr)
    df <- data.frame(
      id = 1:6,
      kegg_compound = c("a", "b", "b", NA, "c", NA)
    )
    df %>% 
      dplyr::group_by(kegg_compound) %>% 
      dplyr::filter(n() == 1) %>% 
      dplyr::ungroup()
    #> # A tibble: 2 x 2
    #>      id kegg_compound
    #>   <int>        <fctr>
    #> 1     1             a
    #> 2     5             c
    
[/code]


CC BY-SA 3.0
2017-06-01T13:00:31.323
35197
2017-06-01T13:00:31.323
19063
35193
answer