Как можно установить подкадр данных nrow и группами в r? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть датафрейм, который содержит 240 000 объектов. из 7 переменных. В кадре данных есть 100 групп по 2400 записей в каждой, по Symbol. Пример:

Полный фрейм данных

Я хочу разделить этот фрейм данных на новый фрейм данных, который содержит каждое первое наблюдение и каждое наблюдение 240.
Новый фрейм данных будет 1000 obs из 7 переменных:

Новый фрейм данных

Я пытался df[seq(1, nrow(df), 240), ], но новый фрейм данных имеет каждое 240 наблюдений и не различается по группам (Symbol). Я имею в виду, я хочу новый фрейм данных, который содержит строки 240, 480, 720, 960 и т. Д. Для каждого символа. В исходном фрейме данных каждый символ имеет 2400 единиц измерения, поэтому новый кадр данных будет иметь 10 единиц наблюдения по группам.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вот один из способов использования базы 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
0 голосов
/ 06 сентября 2018

Поскольку у нас нет ваших данных, мы можем использовать базу данных R: iris. В этом примере мы разделяем iris на Species и выбираем первые n строки, используя head, в этом примере я устанавливаю n=5, чтобы извлечь первые 5 строк на Species

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