繁体   English   中英

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

[英]How can subset a dataframe by nrow and groups in r?

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

完整的DataFrame

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

新的DataFrame

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

由于没有您的数据,因此可以使用R数据库: iris 在此示例中,我们按Species划分iris ,并使用head选择前n行,在此示例中,我设置n=5以按Species提取前5行

> 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
> 

更新

根据您的意见,请使用data.frame尝试以下操作:

ind <- seq(from=240, to=240000, by=240) # a row index of length = 1000
split_data <- lapply(split(yourData, yourData$Symbol), function(x) x[ind,] )
do.call(rbind, split_data)

这是使用基数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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM