bugfix> r > 投稿

分解する必要がある遺伝学と呼ばれる大きなデータセットがあります。 4つの列があります。最初の列は、重複する場合がある患者IDと、患者を説明する3つの列です。

前に述べたように、患者IDの一部は重複しており、残りの列を失うことなく、どのIDかを知りたいのです。

dedupedGenID<- unique(Genetics$ID) 列なしで、一意のIDのみを取得します。

私がしたそれらの一意のIDでdfをサブセット化するために

dedupedGenFull <- Genetics[str_detect(Genetics$patientID, pattern=dedupedGenID,]

これにより、「長いオブジェクトの長さは短いオブジェクトの長さの倍数ではない」というエラーが発生し、dedupedGenFullには55行しかありませんが、dedupedGenIDは1837の文字ベクトルです。

私の質問は次のとおりです。サブセット化の手順を正しく実行するにはどうすればよいですか?どうすれば同じことができますか?乗算されます、つまり、どのようにdfをサブセット化して、繰り返す患者のIDと他の列を取得するのですか?

どんな考えでもいただければ幸いです。

回答 2 件
  • 使用できます duplicated 取得するため ID 乗算され、それを使用して subset データ

    subset(Genetics, ID %in% unique(ID[duplicated(ID)]))
    
    

    別のアプローチは、行数を ID 1より大きい行を選択します。

    これはベースRで行うことができます:

    subset(Genetics, ave(seq_along(ID), ID, FUN = length) > 1)
    
    

    dplyr

    library(dplyr)
    Genetics %>% group_by(ID) %>% filter(n() > 1)
    
    

    そして data.table

    library(data.table)
    setDT(Genetics)[, .SD[.N > 1], ID]
    
    

  • library(data.table)
    genetics <- data.table(genetics)
    genetics[,':='(is_duplicated = duplicated(ID))]
    
    

    このチャンクはデータからdata.tableを作成し、IDが重複している場合はTRUEを、そうでない場合はFALSEを含む新しい列を追加します。ただし、重複するものだけをマークします。つまり、最初のものはFALSEとしてマークされます。

あなたの答え