【问题标题】:How to subset data frames in a list by row number range with lapply?如何使用 lapply 按行号范围对列表中的数据框进行子集化?
【发布时间】:2019-11-07 01:24:27
【问题描述】:

我有一个数据框列表。我想提取每个数据帧的前 248 行,然后将它们绑定到一个数据帧中。

allData 是数据帧列表。我尝试将lapplysubset 一起使用,但我不知道如何在其中引用行号。 subset 函数的“子集”参数似乎只接受逻辑向量。

temp <- lapply(allData, subset, subset = (row.names(allData) <= 248))

这段代码是我的想法,它不起作用,因为row.names(allData) 实际上只适用于列表本身,而不适用于数据框。那么如何引用每个数据框的行号呢?

【问题讨论】:

    标签: r data-analysis data-cleaning


    【解决方案1】:

    使用base R,我们可以做到

    do.call(rbind, lapply(allData, function(x) x[1:248, ]))
    

    或与purrr

    purrr::map_dfr(allData, ~.[1:248, ])
    

    使用具有mtcars 数据的可重现示例并对前 5 行进行子集化。

    allData <- list(mtcars, mtcars)
    do.call(rbind, lapply(allData, function(x) x[1:5, ]))
    
    #                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #Mazda RX4          21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #Mazda RX4 Wag      21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #Datsun 710         22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    #Hornet 4 Drive     21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    #Hornet Sportabout  18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    #Mazda RX41         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #Mazda RX4 Wag1     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #Datsun 7101        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    #Hornet 4 Drive1    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    #Hornet Sportabout1 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    

    【讨论】:

    • 带有基本包的不错的解决方案。我不得不查找function(x) 部分,结果证明它被称为“匿名函数”。更多信息:link
    • 对于基础,使用do.call() 执行lapply(allData, `[`, 1:248, ) 可能更简单。但是,匿名函数可能更容易理解。
    • @Cole 是的……那肯定更短。
    【解决方案2】:

    另一个tidyverse 方法:

    library(tidyverse)
    
    allData %>% 
      map_df(function(x) x %>% slice(1:10))
    

    由于OP没有提供样本数据,我们可以使用iris数据集:

    allData <- list(iris1 = iris[1:50,], # create a list with iris
                    iris2 = iris[51:100,], 
                    iris3 = iris[101:150,])
    
    allData %>% 
      map_df(~.[1:10,])
    
    ## (first 10 rows)
    #  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    #1           5.1         3.5          1.4         0.2     setosa
    #2           4.9         3.0          1.4         0.2     setosa
    #3           4.7         3.2          1.3         0.2     setosa
    #4           4.6         3.1          1.5         0.2     setosa
    #5           5.0         3.6          1.4         0.2     setosa
    #6           5.4         3.9          1.7         0.4     setosa
    #7           4.6         3.4          1.4         0.3     setosa
    #8           5.0         3.4          1.5         0.2     setosa
    #9           4.4         2.9          1.4         0.2     setosa
    #10          4.9         3.1          1.5         0.1     setosa
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2020-09-11
      • 2018-10-02
      相关资源
      最近更新 更多