Я пытаюсь создать новый набор данных из существующего. Новый набор данных должен объединить 60 строк из исходного набора данных, чтобы преобразовать сумму событий, происходящих каждую секунду, в итоговую сумму за минуту. Количество столбцов, как правило, заранее не известно.

Например, с этим набором данных, если мы разделим его на группы по 3 строки:

d1
  a b c d
1 1 1 0 1
2 0 1 0 1
3 0 1 0 0
4 0 0 1 0
5 0 0 1 0
6 1 0 0 0

Мы получим этот data.frame. Строка 1 содержит суммы столбцов для строк 1-3 d1, а строка 2 содержит суммы столбцов для строк 4-6 d1:

d2
  a b c d
1 1 3 0 2
2 1 0 2 0

Я пробовал d2<-colSums(d1[seq(1,NROW(d1),3),]), и это почти все, что мне удалось.

Я также рассмотрел рекомендации Как суммировать строки на основе нескольких условий - R?, Как выбрать каждую x-ю строку из таблицы, Удалить последнюю N строк во фрейме данных с произвольным количеством строк, суммируйте два столбца в R и Объединение нескольких объедините строки в одну строку. У меня нет идей. Любая помощь будет принята с благодарностью.

r
1
Bar-Tzur 13 Сен 2018 в 01:17

2 ответа

Лучший ответ

Создайте группирующую переменную, group_by эту переменную, затем summarise_all.

# your data
d <- data.frame(a = c(1,0,0,0,0,1),
                b = c(1,1,1,0,0,0),
                c = c(0,0,0,1,1,1),
                d = c(1,1,0,0,0,0))

# create the grouping variable 
d$group <- rep(c("A","B"), each = 3)

# apply the mean to all columns
library(dplyr)
d %>% 
  group_by(group) %>% 
  summarise_all(funs(sum))

Возвращает:

# A tibble: 2 x 5
  group     a     b     c     d
  <chr> <dbl> <dbl> <dbl> <dbl>
1 A         1     3     0     2
2 B         1     0     3     0
1
Rich Pauloo 12 Сен 2018 в 22:46

Обзор

Прочитав разделив фрейм данных по количеству строк, я понял, что единственное, что вам нужно знать, это то, как вы хотите split() d1.

В этом случае вы хотите разделить d1 на несколько фреймов данных на основе каждых трех строк. В этом случае вы используете rep() , чтобы указать, что вы хотите, чтобы каждый элемент в последовательности - 1:2 - повторялся три раза (количество строк, деленное на длину вашей последовательности).

После этого логика включает использование map() для суммирования каждого столбца для каждого фрейм данных, созданный после d1 %>% split(). Здесь может оказаться полезным summarize_all(), поскольку вам не нужно знать имена столбцов заранее.

После завершения вычислений вы используете bind_rows() для объединения всех наблюдений в один фрейм данных.

# load necessary package ----
library(tidyverse)

# load necessary data ----
df1 <-
  read.table(text = "a b c d
1 1 0 1
0 1 0 1
0 1 0 0
0 0 1 0
0 0 1 0
1 0 0 0", header = TRUE)

# perform operations --------
df2 <-
  df1 %>%
  # split df1 into two data frames
  # based on three consecutive rows
  split(f = rep(1:2, each = nrow(.) / length(1:2))) %>%
  # for each data frame, apply the sum() function to all the columns
  map(.f = ~ .x %>% summarize_all(.funs = funs(sum))) %>%
  # collapse data frames together
  bind_rows()

# view results -----
df2
#   a b c d
# 1 1 3 0 2
# 2 1 0 2 0

# end of script #
1
Cristian E. Nuno 13 Сен 2018 в 00:36