2016-10-20 24 views
0

これは簡単なはずですが、この問題を解決する方法については困惑しています。 データフレームがたくさんあり、空(0行、42変数)、以前の作業ステップの情報(x行、42変数)があります。今は単に0行のすべてを削除したいだけです。 まず、私はR:作業スペースからすべてのデータフレームを削除します(空の場合)

alldfnames <- which(unlist(eapply(.GlobalEnv,is.data.frame))) 

第二に、すべてのDFを取得し、私はデータフレームを区別するために関数を記述しようとした:

isFullDF <- function(x) dim(x)[1] > 0 

第三に、私は

for (i in seq_along(alldfnames)) { 
    if(isFullDF(alldfnames[i]) == FALSE){ 
     rm(alldfnames[i]) 
    } else { 
     # do nothing 
    } 
} 

しようとしたが、これは私に数時間の間、エラーを与えます:

Error in if (isFullDF(alldfnames[i]) == FALSE) { :
argument is of length zero

いいですか?

答えて

-1

試してみてください。

isFullDF <- function(nm) nrow(get(nm))>0 

し、代わりにあなたのforループのこの1行のコード:今すぐ

x <- eapply(.GlobalEnv,is.data.frame) 
alldfnames <- names(x[x==T]) 

alldfnamesは、次の機能を使用し、ご使用の環境内のすべてのデータフレーム名が含まれています。

rm(list = alldfnames[!sapply(alldfnames, isFullDF)]) 
+0

なぜDOWNVOTE ??????! – 989

1

最初にを見るとこれは整数のベクトルです。names(alldfnames)は、後に続く変数の名前です。したがって、alldfnames[i]は単なる数字です。あなたが必要です

alldfnames <- names(alldfnames) 

これはdf名の文字ベクトルです。

次に、あなたがdim(x)と(例えば)を行うときに、データフレームがあなたのenviromnentでdfと呼ばれる持って、x文字「DF」ではないデータフレームです。だからあなたはそれを取得する必要があります。これにはgetを使用できます。

isFullDF <- function(x) nrow(get(x)) > 0 

そして、あなたが削除している事が名削除したいもののを持つ文字列であることをRに伝える必要がありrm。反対に、alldfnames[i]と呼ばれるオブジェクトを削除する。すなわち

rm(list=alldfnames[i]) 

(それが空の場合はさておきとして、あなたがelse { }は必要ありません)。 Filterを使用して

+0

名前とオブジェクトに関する私の混乱を解消してくれてありがとう - 私はそれが問題だと分かっていましたが、正確に何が分かるのか分かりませんでした。しかし、最後の行 – litotes

+0

これをクリアしてくれてありがとう。ただし、最後の行rm(list = alldfnames [i])はDFを削除しませんが、エラーメッセージを表示します。rm(list = alledfnamen [i]):オブジェクト 'NA'が見つかりません。 m0h3nの最後の行は何ですか:rm(list = alldfnames [!sapply(alldfnames、isFullDF)])。誰かがなぜ私に説明したのだろうか?とにかく、すごく助けてくれてありがとう! – litotes

+0

'alldfnames [i]'は 'NA'でなければなりません。理由を確認する必要があります。私に伝える方法はありません。行ごとにコードをステップ実行し、何が起こっているかを確認します。 –

0

alldfnames = names(which(unlist(eapply(.GlobalEnv,is.data.frame)))) 

rowCounts = sapply(alldfnames,function(x) ifelse(nrow(get(x))==0,1,0)) 

emptyDF = names(Filter(function(f) f==1, rowCounts)) 

rm(list = emptyDF) 
関連する問題