2017-07-12 65 views
2

我運行了一個循環,它遍歷並創建了一堆名稱全部以「results_」開頭並且長度不同的對象,其中很多都是0.在R環境中刪除不符合標準的對象

爲了使物體更容易的這個名單來處理,我想刪除其nrow等於0。我已經試過下面各種提供類似的問題這一個解決方案中的任何物體,但沒有工作了我特殊案例。我究竟做錯了什麼?

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):真正的問題是,你不應該建立這樣的元素首先!相反,在列表和data.frames中組織數據。 –

回答

2

我會用get去,因爲它返回的對象,而不是把它在一個列表。嘗試

rm(list = ls(pattern = "results_")[sapply(ls(pattern = "results_"), function(x) 
                    NROW(get(x))) == 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

關於你的問題,我的建議是存儲列表中所有對象,然後我的這份名單與nrow == 0對象,這是多少不是試圖自LS變量名的工作()函數只返回名稱爲字符,而不是對象本身,所以你需要找到一種方法之後調用它們更容易。下面,我張貼在如何做到這一點有一個列表,其中,第一基質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