2017-07-12 6 views
2

名前がすべて "results_"で始まり、多くが0であるnrowの長さの異なるオブジェクトの束を反復して作成したループを実行しました。R環境で基準に適合しないオブジェクトを削除する

処理するためにオブジェクトのリストを簡単にするために、私は、そのnrow 0に等しい。私はこの1つに類似の質問のために提供のさまざまなソリューションの下にしようとした任意のオブジェクトを削除したいが、どれも私のために働いていません具体的事例。私は間違って何をしていますか?

Attempt 1rm(list=ls(all=TRUE)[sapply(mget(ls(all=TRUE)), function(x) nrow(x) == 0)])

Attempt 2rm(list=ls()[!sapply(mget(ls(),.GlobalEnv), function(x) { nrow(x) == 0 })])

Attempt 3

rm(list= 
    Filter(
     Negate(is.na),         # filter entries corresponding to objects that don't meet function criteria 
     sapply(
      ls(pattern="^results_"),      # only objects that start with "results_" 
      function(x) if(nrow(x) == 0) x else NA # return names of objects of nrow length 0 
     ))) 
+0

"_結果" 'RM(リスト=のLS(パターン=を試してみてください)[sapply(LS(パターン= "results_")、機能(x)はNROW(取得(X)) )== 0]) ' –

+0

@dbありがとうございました!答えとして提出すれば、私はそれをチェックします。また、なぜ「NROW」が動作しているのか、「NROW」は動作していないのか分かりません。 – Phil

+0

これは、典型的な[X/Yの問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)である:本当の問題は、あなたがそのような要素を作成すべきではないということです最初の場所に!代わりに、リストとデータフレームでデータを整理します。 –

答えて

2

ではなく、リストにそれを置くのオブジェクトを返すように私はgetで行くと思います。これは非常にあるnrowの== 0でのオブジェクトのこのリストを、あなたの問題については

results_1 = data.frame(x = 1:5) 
results_2 = data.frame(x = numeric(0)) 
NROW(results_1) 
#[1] 5 
NROW(results_2) 
#[1] 0 
ls() 
#[1] "results_1" "results_2" 
rm(list = ls(pattern = "results_")[sapply(ls(pattern = "results_"), function(x) 
                    NROW(get(x))) == 0]) 
ls() 
#[1] "results_1" 
+0

は、それが代わりに 'nrow'の' NROW'を必要な理由を知っていますか?私はベクトルを1列の行列として扱うことがどのように影響するかについてはっきりしていません。 – Phil

+0

@Phil、 'ベクトルがあってもNROW'が働きます。 'NROW(1)'と 'nrow(1)'を試してみてください。 –

0

rm(list = ls(pattern = "results_")[sapply(ls(pattern = "results_"), function(x) 
                    NROW(get(x))) == 0]) 

を試してみて、私の提案は、リスト内のすべてのオブジェクトを格納するだろうし、その後鉱山あなたが後にそれらを呼び出すための方法を見つける必要がありますので、LS()関数であるため、変数名で作業しようとするよりも簡単そのものにのみ文字などの名前ではなくオブジェクトを返します。私の下には第1の行列が、これはあなたを助けるnrow == 0希望であるリストであることを行う方法についての短いおもちゃの例を掲載しました。 敬具、


superList=c() #define a list to store your objects 
for(i in 0:5){ #generate them and store them in your list, the first matrix has nrow = 0 
    item=matrix(nrow = i,ncol=2) 
    superList[[i+1]]=item 
    print(i) 

} 
toErase=sapply(superList,function(x) nrow(x)==0) #scan your list to find object with nrow==0 
superList=superList[-which(toErase==TRUE)] #remove them from your list 
sapply(superList,function(x) nrow(x)) #check that the first matrix 
関連する問題