2017-05-27 118 views
2

我想從列表中刪除部分以將列表減少爲具有特定列數的列表中的元素。使用循環從數據幀列表中刪除數據幀

的什麼,我試圖做一個虛擬的例子:

#1: define the list 
    tables = list(mtcars,iris) 

    for(k in 1:length(tables)) { 
     # 2: be sure that each element is shaped as dataframe and not matrix 
     tables[[k]] = as.data.frame(tables[[k]]) 
     # 3: remove elements that have more or less than 5 columns 
     if(ncol(tables[[k]]) != 5) { 
     tables <- tables[-k] 
     } 
    } 

另一種選擇我想:

#1: define the list 
    tables = list(mtcars,iris) 

    for(k in 1:length(tables)) { 
     # 2: be sure that each element is shaped as dataframe 
     tables[[k]] = as.data.frame(tables[[k]]) 
     # 3: remove elements that have more or less than 5 columns 
     if(ncol(tables[[k]]) != 5) { 
     tables[[-k]] <- NULL 
     } 
    } 

我越來越

錯誤表[ [k]]:下標越界。

有沒有其他正確的方法?

回答

2

我們可以使用Filter

Filter(function(x) ncol(x)==5, tables) 

或用sapply創建一個邏輯索引和子集list

tables[sapply(tables, ncol)==5] 

或者作爲@Sotos評論

tables[lengths(tables)==5] 

lengths返回length每個list元素將其轉換爲邏輯向量和子集list。一個data.framelength是列數有

+0

將修剪到最大。 5列的數量,我想從列表中刪除列數不同於5的列中的元素 ,但我會嘗試lapply – pachamaltese

+1

@pachamaltese更新後 – akrun

+2

也'長度(表格) – Sotos

1

對於您可以使用purrr:keep此一tidyverse選項。你只需定義一個謂詞函數,如果它是true,它將保留list元素,如果爲false,則將其移除。在這裏我已經用公式選項完成了。


library(purrr) 

tables <- list(mtcars, iris) 

result <- purrr::keep(tables, ~ ncol(.x) == 5) 

str(result) 

#> List of 1 
#> $ :'data.frame': 150 obs. of 5 variables: 
#> ..$ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 
#> ..$ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... 
#> ..$ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 
#> ..$ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 
#> ..$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...