Выберите диапазон строк из каждых n строк из фрейма данных - PullRequest
2 голосов
/ 01 августа 2020

В моем data.frame 2880 наблюдений. Мне нужно создать новый data.frame, в котором я должен выбрать строки от 25 до 77 из каждых 96 выбранных строк.

df.new = df[seq(25, nrow(df), 77), ] # extract from 25 to 77

Приведенный выше код извлекает только строки с номерами от 25 до 77, но я хочу, чтобы все ряд с 25 по 77 через каждые 96 рядов.

Ответы [ 4 ]

1 голос
/ 01 августа 2020

Вы можете использовать технику повторного использования для извлечения этих строк:

from = 25
to = 77
n = 96

df.new <- df[rep(c(FALSE, TRUE, FALSE), c(from - 1, to - from + 1, n - to))), ]

Для объяснения этого примера это будет работать как:

length(rep(c(FALSE, TRUE, FALSE), c(24, 53, 19))) #returns
#[1] 96

В этих 96 значениях значение 25-77 - это TRUE, а остальные - FALSE, что мы можем проверить:

which(rep(c(FALSE, TRUE, FALSE), c(24, 53, 19)))
# [1] 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#[23] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
#[45] 69 70 71 72 73 74 75 76 77

Теперь этот вектор повторно используется для всех оставшихся строк в фрейме данных.

1 голос
/ 01 августа 2020

Один из вариантов - создать вектор индексов, с которым подмножество фрейма данных.

idx <- rep(25:77, times = nrow(df)/96) + 96*rep(0:29, each = 77-25+1)
df[idx, ]
0 голосов
/ 01 августа 2020

Однострочное решение base.

lapply(split(df, cut(1:nrow(df), nrow(df)/96, F)), `[`, 25:77, )

Примечание: Ничего после последней запятой

Приведенный выше код возвращает список. Чтобы объединить все данные вместе, просто передайте результат выше в

do.call(rbind, ...)
0 голосов
/ 01 августа 2020

Сначала определите переменную Group со значениями от 1 до 30, каждое значение повторяется 96 раз. Затем определите RowWithinGroup и при необходимости отфильтруйте. Наконец, отмените внесенные изменения для фильтрации.

df <- tibble(X=rnorm(2880)) %>% 
        add_column(Group=rep(1:96, each=30)) %>% 
        group_by(Group) %>% 
        mutate(RowWithinGroup=row_number()) %>% 
        filter(RowWithinGroup >= 25 & RowWithinGroup <= 77) %>% 
        select(-Group, -RowWithinGroup) %>% 
        ungroup()

Добро пожаловать в SO. Возможно, этот вопрос раньше не задавался в такой точной форме, но требуемые принципы были перефразированы во многих, многих вопросах и ответах,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...