2017-07-06 8 views
0

フィルタリングしたいデータがあります。私は%の列の値が指定された値より小さい場合、データフレームから行を削除する方法はありますか?

 Sample1, Sample2, Sample3, Sample4, Sample5, Sample6 
Item1 0 0 0 0 0 0 
Item2 478 440 522 578 1066 1045 
Item3 16 14 9 6 6 20 

。いくつかのサンプルデータである。ここ

。各行の指定した割合が示されているよりも少ない値が含まれている場合、データフレームからその行を削除する」、と言うことができるようにしたいのは、言ってみましょう私は10未満の値を持つ列の50%の行を削除する必要があります。その場合、Item1行が削除され、Item3行が削除されます。

基準を列の50% 7未満の値、次にItem1のみ、Item2およびItem3が残ります。

Rでこれを達成するためのすてきな方法はありますか?これは簡単な問題であり、私はそれを達成するために乱雑なコードを書くことを避けたい。私が今までに読んだことから、lapply()でこれをやっているはずですか?私はどんな洞察にも感謝します。

答えて

1

インデックス作成だけでこれを行うことができます。

## reproduce your data 
df = read.table(text="ItemNum Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 
Item1 0 0 0 0 0 0 
Item2 478 440 522 578 1066 1045 
Item3 16 14 9 6 6 20", 
header=TRUE, stringsAsFactors=FALSE) 

df = df[which(rowSums(df[,2:7] < 10) < 3), ] 
df 
    ItemNum Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 
2 Item2  478  440  522  578 1066 1045 
+0

おかげで、これは私がしようとしていたものよりもはるかに優れています。私は、私が扱っている列の数が異なっているかどうかを少し変更しました。 df = counts [which(rowSums(counts [、2:ncol(counts)] <10) ありがとうございます。 –

+0

'rowMeans'を使い、' df [rowMeans(df [、2:7] <10)<0.5、] 'につながる' which'の余計な使い方を少し簡単にします。 – lmo

1
library(data.table) 

dat <- fread("Item Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 
       Item1 0 0 0 0 0 0 
       Item2 478 440 522 578 1066 1045 
       Item3 16 14 9 6 6 20")  

slice_val <- 10 
dat[apply(dat[, !"Item"], 1, function(x) sum(x > slice_val)/length(x)) > 0.5] 

    Item Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 
1: Item2  478  440  522  578 1066 1045 

slice_val <- 7 
dat[apply(dat[, !"Item"], 1, function(x) sum(x > slice_val)/length(x)) > 0.5] 

    Item Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 
1: Item2  478  440  522  578 1066 1045 
2: Item3  16  14  9  6  6  20 
関連する問題