Суммирование группы столбцов по количеству строк - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь создать новый набор данных из существующего. Предполагается, что новый набор данных объединит 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

Мы получим эти данные. Строка 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 и Объединение нескольких строк в одну строку . У меня все без идей. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

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

Создайте группирующую переменную, 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
0 голосов
/ 13 сентября 2018

Обзор

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

В этом случае вы хотите разделить d1 на несколько фреймов данных на основе каждых 3 строк. В этом случае вы используете 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 #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...