我有一个数据帧列表。我想提取每个数据帧的前248行,然后将它们绑定到一个数据帧中。
allData
是数据帧的列表。我尝试将lapply
与subset
一起使用,但我不知道该如何引用其中的行号。似乎subset
函数的“ subset”参数仅接受逻辑向量。
temp <- lapply(allData, subset, subset = (row.names(allData) <= 248))
这是我的想法,它不起作用,因为row.names(allData)
实际上仅适用于列表本身,不适用于数据帧。那么如何参考每个数据帧的行号呢?
答案 0 :(得分:3)
使用基数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
答案 1 :(得分: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