2016-06-23 4 views
0

私は44列と60000行のデータフレームを持っています。それらの行が最大75%の列を持つ場合、それらの行を削除したいと考えました。この75%:例えば私のケースでは、44列33列。そして私は、それは完全に私が尋ねたそれらの列を探している列の値の75%が0に等しい場合、データフレームから行を削除する方法

filter <- apply(df, 1,function(x) any(x[1:33]!=0) && any(x[34:44]!=0)) 
df = df[filter,] 

、としてR で、次の機能を試してみました。しかし、問題は私のデータフレームは、このような値を持つ多くの行を持っている、特定の行の代替モデル、すなわち、1つの列の数値と0のようにゼロがあります。これは時には33列以上であり、上記の関数はこれらの行を避けます。

は、これまでのところ私はすべての値がここでパンダ

df[(df != 0).all(1)] 

にゼロに等しくないとき、私はパンダに試すことができます任意のソリューションもまた素晴らしい..私が知っていることだろうされ、Rで試してみましたどのように私です

dim(df) 
[1] 57905 44 
head(df) 

    ID Pe_1 Pe_2 Pe_3 Pe_4 Pe_5 Pe_6 Pe_7 Pe_8 Pe_9 Pe_10 Pe_11 Pe_12 Pe_13 Pe_14 Pe_15 Pe_16 Pe_17 Pe_18 Pe_19 Pe_20 Pe_21 Pe_22 Pe_23 Pe_24 Pe_25 Pe_26 Pe_27 Pe_28 Pe_29 Pe_30 Pe_31 Pe_32 Pe_33 Pe_34 Pe_35 Pe_36 Pe_37 Pe_38 Pe_39 Pe_40 Pe_41 Pe_42 Pe_43 Pe_44 
ENSG1 0 0 1 0 0 2 2 1 0 0 0 1 0 3 3 0 1 0 2 0 2 3 1 2 0 2 0 0 0 0 0 2 0 0 0 0 2 0 0 2 0 3 1 3 
ENSG2 274 293 300 273 229 124 427 291 274 561 128 506 342 540 376 422 411 190 723 224 303 316 766 697 251 167 271 361 325 133 215 274 217 366 227 579 337 254 570 188 143 363 250 359 
ENSG3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
ENSG4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
ENSG5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
ENSG6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
ENSG7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
ENSG8 0 1 0 1 1 1 0 2 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 1 2 1 0 3 0 1 1 2 0 0 0 0 0 0 1 1 0 0 1 1 
ENSG9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
ENSG10 3 2 4 6 21 6 6 13 3 1 1 6 10 4 2 0 1 0 0 0 4 2 5 3 25 9 7 10 7 5 3 0 0 5 1 8 4 5 0 4 1 3 2 4 
ENSG11 277 43 79 216 1170 174 213 1303 564 14 53 76 170 1016 32 19 69 69 50 21 75 31 560 86 2668 604 513 303 1378 109 219 172 10 1031 276 242 1587 217 76 43 450 81 502 99 

どれsuggetsions /ヘルプは

+0

データを削除することができますか?クリーンアップリストで

RemoveRows = RemoveRows[RemoveRows > 0] #Leaves no zeroes in the list 

(ゼロを除く)、そのリストをクリーンアップする必要がありますか次に、この関数 'isna()'があります。これは基本的にあなたがそれらの行を削除するのを助けることができます。 –

+0

NAsまたは0で削除する必要はありませんが、これらの行を削除またはフィルタリングします。列の値の75%が0の場合 – user1017373

+1

Rの場合、これはほぼhttp://stackoverflow.com/questions/37879467/と重複しています。 –

答えて

7

素晴らしいことだ、のようなデータフレームは、あなたが0の75%以上を持っている行を削除するようだ見えます。たとえば、ゼロ以外の値が少なくとも25%の行を保持します。 R

df = data.frame(a=c(1,8,0), b=c(0,2,0), c=c(0,0,1), d=c(4,4,0)) 

df[rowMeans(df!=0)>0.25, ] # or df[rowMeans(df==0)<0.75, ] 
# a b c d 
#1 1 0 0 4 
#2 8 2 0 4 

そしてPandas中:

あなたが rowSumsを使用することができます rowMeansの@大佐-beauvelの使用に
df = pd.DataFrame({'a':[1,8,0],'b':[0,2,0],'c':[0,0,1], 'd':[4,4,0]}) 

# In [198]: df 
# Out[198]: 
# a b c d 
#0 1 0 0 4 
#1 8 2 0 4 
#2 0 0 1 0 

df[df.astype('bool').mean(axis=1)>=0.25] # or df[(~df.astype('bool')).mean(axis=1)<0.75] 

#Out[199]: 
# a b c d 
#0 1 0 0 4 
#1 8 2 0 4 
+0

申し訳ありませんが、平均を探していて、行をフィルタリングするように頼んでいません。 – user1017373

+0

これは、0以外の値で満たされた列の75%を超える行をフィルタリングしています。あなたの記述は誤解を招きます。たとえば、5行と4列のデータフレームで問題を再定式化できますか? –

+1

'df [rowMeans(df == 0)<0.75、]'として明示的に書くと分かりやすいかもしれません。 –

1

またはanalgously。

df[rowSums(df[, -1] > 0)/(ncol(df)-1) >= 0.75,] 
  • DF [-1]> 0 ID列以外DFと、data.frameを取り、各要素かどうかを、論理行列を返します。
  • rowSumsは、すべての行をまとめて加算します(rowMeansは超高速です)。
  • ncolがDFの列の数を返す(そこからI 1を減算します)。
  • rowSumsncolの比率は、論理を返す0.75と比較されます。

この論理は、行をサブセット化するために使用されます。

3

(パンダ)これを試してみてください。

df[(df==0).sum(axis=1)/len(df.columns) <= 0.75] 
2

パンダの方法は、ここで我々はaxis=1を使用して0sum行方向に対してDFを比較し、これが0値のカウントでSeriesを生成します、我々は比較この行の長さの75%に対して及びDFをフィルタリング:

In [14]: 
df[(df == 0).sum(axis=1) < df.shape[1] * 0.75] 

Out[14]: 
     ID Pe_1 Pe_2 Pe_3 Pe_4 Pe_5 Pe_6 Pe_7 Pe_8 Pe_9 ... \ 
0 ENSG1  0  0  1  0  0  2  2  1  0 ...  
1 ENSG2 274 293 300 273 229 124 427 291 274 ...  
7 ENSG8  0  1  0  1  1  1  0  2  0 ...  
9 ENSG10  3  2  4  6 21  6  6 13  3 ...  
10 ENSG11 277 43 79 216 1170 174 213 1303 564 ...  

    Pe_35 Pe_36 Pe_37 Pe_38 Pe_39 Pe_40 Pe_41 Pe_42 Pe_43 Pe_44 
0  0  0  2  0  0  2  0  3  1  3 
1  227 579 337 254 570 188 143 363 250 359 
7  0  0  0  0  1  1  0  0  1  1 
9  1  8  4  5  0  4  1  3  2  4 
10 276 242 1587 217  76  43 450  81 502  99 

[5 rows x 45 columns] 
0

簡単なコード、それが動作するはず:

for i in df: 
    iLength = 0 
    countZeros = 0 

    for j in df: 
     iLength += 1 
     if i[j] == 0: 
      countZeros += 1 

    zeroRate = countZeros/iLength 
    if zeroRate >= 0.75: 
     #DeleteRow 
-2

R・ソリューションは、(うまくいけば)

私はあなたがしたい曲のビットをダウンスキップ、私はこれを得たと思います。あちこちでその全ての文脈でそうであり、データフレーム

DF<-MakeDF.R(c(1:44),10) 
#sample df with 44 rows 

がゼロ

DF[c(5,6,7),] <- c(1:44)*0 
#add sample zero rows 
でいくつかの行を追加してくださいR.

MakeDF.R <- function(CustomVector,n){ 
    #just a function to make a sample df 
    NewDF <- data.frame(matrix(nrow=n,ncol=length(CustomVector))) 
    colnames(NewDF) <- CustomVector 
    return(NewDF) 
} 

で働いて見ることができるとのコード

あなたが望むビットのために今すぐ。

RemoveRows <- lapply(1:nrow(DF),function(i){ 
    RemoveRow_i = 0 
    if(
    length(which(DF[i,] == 0)) > (ncol(DF) * 0.75) ){ 
    #above is the "more than 75% zero columns step 
    RemoveRow_i = i #select this row as one to be removed 
    } 
    RemoveRow_i 
    #return either the row number or zero 
}) 

削除する行の一覧が表示されます。今、私たちはちょうど私はあなたがRでNAに0年代を設定することができると信じて

CleanedDF <- DF[-do.call(rbind,RemoveRows)[,1],] 
#the do.call(rbind....) is returning a 1 column dataframe. 
#So the first column is the vector of rows we want to remove. 
#the -c(row numbers) removes rows. df[-1,] would delete the first row 
#df[-c(1,2),] would delete the first two rows 
関連する問題