[英]How to subset data frames in a list by row number range with lapply?
我有一个数据框列表。 我想提取每个数据帧的前248行,然后将它们绑定到一个单独的数据帧中。
allData
是数据帧列表。 我试图使用lapply
与subset
但我不知道如何在那里引用行号。 看来子subset
函数的“子集”参数只接受逻辑向量。
temp <- lapply(allData, subset, subset = (row.names(allData) <= 248))
这段代码是我的想法,它不起作用,因为row.names(allData)
实际上只适用于列表本身,而不是数据帧。 那么如何引用每个数据帧的行号呢?
使用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
另一种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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.