【问题标题】:Remove dataframes from list of dataframes using loop使用循环从数据框列表中删除数据框
【发布时间】:2017-10-28 10:02:24
【问题描述】:

我想从列表中删除部分,以将列表减少为具有一定数量列的元素。

这是我正在尝试做的一个虚拟示例:

    #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]]:下标超出范围。

是否有替代且正确的方法?

【问题讨论】:

    标签: r list for-loop dataframe


    【解决方案1】:

    我们可以使用Filter

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

    或者用sapply创建一个逻辑索引和子集list

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

    或者正如@Sotos 评论的那样

    tables[lengths(tables)==5]
    

    lengths 返回每​​个list 元素的length 将其转换为逻辑向量并将list 子集化。 lengthdata.frame 是它的列数

    【讨论】:

    • 这将修剪到最大。 5 列的数量,我想从列表中删除列数不同于 5 的元素,但我会尝试 lapply
    • @pachamaltese 更新了帖子
    • 还有lengths(tables)
    【解决方案2】:

    对于 tidyverse 选项,您可以为此使用 purrr:keep。您只需定义一个谓词函数,如果为 true,则保留列表元素,如果为 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 ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 2021-11-06
      • 2020-10-29
      • 2021-01-12
      • 2023-03-18
      • 2020-12-16
      • 2017-02-13
      相关资源
      最近更新 更多