2016-03-21 7 views
0

データを処理するためのスクリプトを作成しており、データセットから削除された行のペアが必要です。下の例では、20,000未満であれば最初の希釈(2番目の希釈よりも小さい)を維持したいが、2番目の希釈が何であれ、最初の希釈が2万を超える場合は2番目の希釈を選択する。正確な希釈値はデータセットごとに異なりますが、患者ごとに決して2倍以上に希釈されることはありませんので、まず最低希釈を最初に20,000の閾値と比較して確認します。また、このデータセットにはメタデータを含む多くの列が含まれています。R - 条件に基づいてデータフレーム内の各ペアの行のペアを削除します

Patient Dilution Value 
John  2   30000 
John  20   15000 
George 2   13000 
George 20   700 
Kelly  2   49000 
Kelly  20   24000 
Tom  2   80000 
Tom  20   30000 
Diane  2   700 
Diane  20   0 

Patient Dilution Value 
John  20   15000 
George 2   13000 
Kelly  20   24000 
Tom  20   30000 
Diane  2   700 

ここで私のコードの残りの部分を見たい場合は、(はい、私はnoobです)。

dplyr
###SA Summary 

sadf <- merge(mydata, elisadata, "Description", all.x = TRUE) 

sadf <- sadf[grep("X", sadf$Type),] 
sadf <- sadf[-grep("Blank", sadf$Name),] 
sadf <- sadf[-grep("MulV", sadf$Name),] 
sadf <- sadf[,c("Isotype","Name","Description","Dilution.x","FI-Bkgd-Neg","Error","Conc..ug.ml.")] 

sadf$Error <- as.character(sadf$Error) 
sadf$Error[sadf$Conc..ug.ml. < 0.05] <- "LC" 
sadf$Conc..ug.ml. <- ifelse(!is.na(sadf$Conc..ug.ml.) & sadf$Conc..ug.ml. < 0.05, NA, sadf$Conc..ug.ml.) 

sadf$SA <- with(sadf, sadf$`FI-Bkgd-Neg` * sadf$Dilution.x/sadf$Conc..ug.ml.) 

sadf$SA[sadf$SA < 0.02] <- 0.02 

if (unique(sadf$Dilution) > 1) {} ###Where I need to put the answer to the question 

sadf$`FI-Bkgd-Neg` <- NULL 
sadf$Error[is.na(sadf$Error)] <- 0 
sadf$Conc..ug.ml.[is.na(sadf$Conc..ug.ml.)] <- 0 
sadf <- reshape(sadf, idvar = c("Description","Dilution.x","Isotype","Error","Conc..ug.ml."), timevar = "Name", direction = "wide") 
sadf$Error[sadf$Error = 0] <- NA 
sadf$Conc..ug.ml.[sadf$Conc..ug.ml. = 0] <- NA 
+0

を使用する必要があります私はあなたが "最初の**希釈を20000以下であれば維持してください..."という意味で、 "最低"ではありません。 – alistaire

答えて

3

group_by患者、次いで条件を満たし(グループ化することによって、患者のための)行へfilterfirstが20000を超えている場合はlastValue、それ以外の場合はminが返されます。

library(dplyr) 
df %>% group_by(Patient) %>% filter(Value == ifelse(first(Value) > 20000, 
                last(Value), 
                min(Value))) 
# Source: local data frame [5 x 3] 
# Groups: Patient [5] 
# 
# Patient Dilution Value 
# (fctr) (int) (int) 
# 1 John  20 15000 
# 2 George  20 700 
# 3 Kelly  20 24000 
# 4  Tom  20 30000 
# 5 Diane  20  0 

注:このアプローチは、問題の結果data.frameを返さないだろう質問の文言に従っています。条件が最初希釈を返すことになっている場合、それは20000の下にある場合、すべてを行う必要がfirstminに変更され、あなたが質問から結果データフレームを取得する:我々は使用することができます

df %>% group_by(Patient) %>% filter(Value == ifelse(first(Value) > 20000, 
                last(Value), 
                first(Value))) 
# Source: local data frame [5 x 3] 
# Groups: Patient [5] 
# 
# Patient Dilution Value 
# (fctr) (int) (int) 
# 1 John  20 15000 
# 2 George  2 13000 
# 3 Kelly  20 24000 
# 4  Tom  20 30000 
# 5 Diane  2 700 
+0

ここでは間違いがあると思います。「希釈」は「値」、「希釈」変数は「2」と「20」だけです。 –

+0

ただ編集しました。私は質問を間違って読んで、私の答えをあまりにも早く修正しようとしました。 – alistaire

+0

これは素晴らしく、素敵で簡単な感謝です!私は20,000未満の場合、最初の希釈を返すことを意味しました。私はそれが最後の希釈より常に小さい数であり、順序どおりではないかもしれないので、それを最も低いものと呼んだが、それがどのように混乱しているかを見る。 – AwesomeeExpress

1

data.table。 'data.table'(setDT(df))を 'Patient'でグループ化し、if/else条件を使用してmin '値'の行をサブセット化し、存在する場合はlastを取得します。

setDT(df1)[df1[ , .I[if(min(Value) <20000) 
     which.min(Value) else .N] , Patient]$V1] 
# Patient Dilution Value 
#1: John  20 15000 
#2: George  20 700 
#3: Kelly  20 24000 
#4:  Tom  20 30000 
#5: Diane  20  0 

条件がfirst「バリュー」に基づいている場合、我々は、first(Value)またはValue[1L]min(Value)から変更を行い、また、検索結果のdata.frameから、1の代わりに、which.min

setDT(df1)[df1[ , .I[if(Value[1L] <20000) 
       1 else .N], Patient]$V1] 
# Patient Dilution Value 
#1: John  20 15000 
#2: George  2 13000 
#3: Kelly  20 24000 
#4:  Tom  20 30000 
#5: Diane  2 700 
+1

ありがとう、これは素晴らしいです!私は最初の希釈を意味しましたが、最初の希釈は常に2番目の希釈よりも少数ですが、それらは順序どおりではないかもしれませんので、代わりにmin(希釈)で最初の例を使用すると思います。 – AwesomeeExpress

関連する問題