如何在R中按nrow和group子集数据帧?

时间:2018-09-05 21:00:09

标签: r dataframe subset

我有一个包含240,000 obs的数据框。 7个变量。在数据框中,有100组,每组2400条记录,分别为Symbol。示例:

Complete DataFrame

我想将此数据帧拆分为包含每个第一个观察值和每个240个观察值的新数据帧。
新数据帧将是1000个obs,包含7个变量:

New DataFrame

我尝试了df[seq(1, nrow(df), 240), ],但是新的数据帧具有240个观察值,并且没有按组(Symbol)进行区分。我的意思是,我想要一个新的数据框,其中包含每个符号的行240、480、720、960等。在原始数据帧中,每个符号都有2400磅,因此新数据帧将按组有10磅。

2 个答案:

答案 0 :(得分:0)

由于我们没有您的数据,因此可以使用R数据库:iris。在此示例中,我们将iris除以Species,然后使用n选择前head行,在此示例中,我将n=5设置为通过{{ 1}}

Species

更新

给出您的评论,使用您的data.frame进行尝试:

> split_data <- lapply(split(iris, iris$Species), head, n=5)
> do.call(rbind, split_data)
              Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
setosa.1               5.1         3.5          1.4         0.2     setosa
setosa.2               4.9         3.0          1.4         0.2     setosa
setosa.3               4.7         3.2          1.3         0.2     setosa
setosa.4               4.6         3.1          1.5         0.2     setosa
setosa.5               5.0         3.6          1.4         0.2     setosa
versicolor.51          7.0         3.2          4.7         1.4 versicolor
versicolor.52          6.4         3.2          4.5         1.5 versicolor
versicolor.53          6.9         3.1          4.9         1.5 versicolor
versicolor.54          5.5         2.3          4.0         1.3 versicolor
versicolor.55          6.5         2.8          4.6         1.5 versicolor
virginica.101          6.3         3.3          6.0         2.5  virginica
virginica.102          5.8         2.7          5.1         1.9  virginica
virginica.103          7.1         3.0          5.9         2.1  virginica
virginica.104          6.3         2.9          5.6         1.8  virginica
virginica.105          6.5         3.0          5.8         2.2  virginica
> 

答案 1 :(得分:0)

这是使用底数R的一种方法。
就像用户@Jilber Urbina的回答一样,我将使用内置数据集iris给出示例。

fun <- function(DF, n = 240, start = n){
  DF[seq(start, NROW(DF), by = n), ]
}

res <- lapply(split(iris, iris$Species), fun, n = 24)
res <- do.call(rbind, res)  
row.names(res) <- NULL
res
#  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#1          5.1         3.3          1.7         0.5     setosa
#2          4.6         3.2          1.4         0.2     setosa
#3          6.1         2.8          4.7         1.2 versicolor
#4          6.2         2.9          4.3         1.3 versicolor
#5          6.3         2.7          4.9         1.8  virginica
#6          6.5         3.0          5.2         2.0  virginica

这可以做成一个函数,我命名为selectStepN

#
# x - dataset to subset
# f - a factor, split criterion
# n - the step
#
selectStepN <- function(x, f, n = 240, start = n){
  fun <- function(DF, n){
    DF[seq(start, NROW(DF), by = n), ]
  }
  res <- lapply(split(x, f), fun, n = n)
  res <- do.call(rbind, res)  
  row.names(res) <- NULL
  res
}

selectStepN(iris, iris$Species, 24)
#  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#1          5.1         3.3          1.7         0.5     setosa
#2          4.6         3.2          1.4         0.2     setosa
#3          6.1         2.8          4.7         1.2 versicolor
#4          6.2         2.9          4.3         1.3 versicolor
#5          6.3         2.7          4.9         1.8  virginica
#6          6.5         3.0          5.2         2.0  virginica