4

以前、データフレームから重複行を抽出することについて質問しました。次に、スクリプトを実行して、これらの重複のどれを最終データセットに保持するかを決定する必要があります。

このデータセットの重複するエントリは、同じ「Assay」と「Sample」の値を持っています。重複するエントリを含む新しいデータセットImの最初の10行は次のとおりです。

     Assay   Sample    Genotype   Data
1  CCT6-002   1486         A        1
2  CCT6-002   1486         G        0
3  CCT6-002   1997         G        0
4  CCT6-002   1997         NA       NA
5  CCT6-002   0050         G        0
6  CCT6-002   0050         G        0
7  CCT6-015   0082         G        0
8  CCT6-015   0082         T        1
9  CCT6-015   0121         G        0
10 CCT6-015   0121         NA       NA

'Data'の値(1、0、またはNA)に基づいて、これらの重複サンプルを4つのビンに分割するスクリプトを実行したいと思います。

 1) All values for 'Data' are NA
 2) All values for 'Data' are identical, no NA
 3) At least 1 value for 'Data' is not identical, no NA.
 4) At least 1 value for 'Data' is not identical, at least one is NA.

上記のデータから期待される結果は次のようになります。

Set 1
Null

Set 2
5  CCT6-002   0050         G        0
6  CCT6-002   0050         G        0

Set 3
1  CCT6-002   1486         A        1
2  CCT6-002   1486         G        0
7  CCT6-015   0082         G        0
8  CCT6-015   0082         T        1

Set 4
3  CCT6-002   1997         G        0
4  CCT6-002   1997         NA       NA
9  CCT6-015   0121         G        0
10 CCT6-015   0121         NA       NA

このデータセットに3つ以上の「重複した」データポイントが存在する場合があります。私はRの初心者であるため、これをどこから始めればよいのかさえわかりません。

編集:期待されるデータを使用。

4

2 に答える 2

4

あなたは他の人にあなたのためにあなたの仕事全体をするように頼む方向に向きを変える質問をしました。このプロジェクトの単一の特定の部分についての質問は、おそらく応答を引き付ける可能性が高くなります。あなたが苦労して始められない部分は、非常に基本的なプログラミングスキルです。問題を小さな具体的なステップに分割し、それぞれを個別に解決してから、それらを再び組み合わせて元の問題を解決する能力です。

ただし、そのスキルを習得するのも非常に困難です。しかし、あなたは良いスタートを切っています!データが分類できる4つのグループを適切に指定しました。

  1. 'Data'の値はすべてNAです

  2. 'Data'のすべての値は同一であり、NAはありません

  3. 'Data'の少なくとも1つの値は同一ではなく、NAはありません。

  4. 'Data'の少なくとも1つの値は同一ではなく、少なくとも1つはNAです。

ここで、データのサブセットが1つしかない場合に、どのグループ(1〜4)に属しているかをRで判別する方法を理解する方法を考える必要があります。以下は、これを行うのに役立つ可能性のあるいくつかのツールのスケッチです。いくつかのサブセットを作成し、各グループを識別できるようになるまでコンソールで遊んでください。

(1)datSub$Data NAsの値はすべてですか?

ツール:allおよびis.na

(2)一意の値は1つだけで、NA

ツール:length、、、、unique_is.naany

(3)複数の一意NAの値、いいえ?

ツール:length、、、、unique_anyis.na

(4)複数の一意の値、少なくとも1つのNA

ツール:length、、、、unique_anyis.na

これらすべての機能を使用せずにこれを行うことは可能かもしれませんが、それらはすべて潜在的に有用です。

特定のサブセットがどのグループに含まれるべきかを決定する方法がわかれば、そのコードを関数にラップする準備が整います。私の提案は、サブセットが属するグループに応じて、値が1〜4の新しい列を作成することです。

myFun <- function(x){
    if (...){
        x$grp <- 1
    }
    if (...){
        x$grp <- 2
    }
    #etc.

    return(x)
}

次に、を使用して、次ddplyの値に基づいてデータの各サブセットにこの関数を適用しますSample

ddply(dat,.(Sample),.fun = myFun)

そして最後に、このデータフレームを新しいgrp変数で分割します。

split(dat,dat$grp)

うまくいけば、この一般的なスケッチがあなたが始めるのに役立つでしょう。しかし、あなた問題を抱えることになります。みんなしている。途中で特定の問題が発生した場合は、それについて別の質問をしてください。

確かに、ジョンが私のスケッチの線に沿って答えを投稿したことがわかりました。ただし、今後の問題の分析に役立つことを期待して、とにかくこの回答を投稿します。

于 2011-10-21T00:06:30.030 に答える
3

これは良いスタートになるはずです。データセットの長さによっては、速度を上げるためにこれを最適化する価値がある場合とない場合があります。

require(plyr)

# Read data
data = read.table('data.txt', colClasses=c(NA, NA, 'character', NA, NA))

# Function to pick set
pickSet <- function(x) {
  if(all(is.na(x$Data))) {
    set = 1
  } else if(length(unique(x$Data)) == 1) {
    set = 2
  } else if(!any(is.na(x$Data))) {
    set = 3
  } else {
    set = 4
  }
  data.frame(Set=set)
}

# Identify Set for each combo of Assay and Sample
sets = ddply(data, c('Assay', 'Sample'), pickSet)

# Merge set info back with data
data = join(data, sets)

# Reformat to list
sets.list = lapply(1:4, function(x) data[data$Set==x,-5])
> sets.list
[[1]]
[1] Assay    Sample   Genotype Data    
<0 rows> (or 0-length row.names)

[[2]]
     Assay Sample Genotype Data
5 CCT6-002   0050        G    0
6 CCT6-002   0050        G    0

[[3]]
     Assay Sample Genotype Data
1 CCT6-002   1486        A    1
2 CCT6-002   1486        G    0
7 CCT6-015   0082        G    0
8 CCT6-015   0082        T    1

[[4]]
      Assay Sample Genotype Data
3  CCT6-002   1997        G    0
4  CCT6-002   1997     <NA>   NA
9  CCT6-015   0121        G    0
10 CCT6-015   0121     <NA>   NA
于 2011-10-21T00:03:20.837 に答える