Объединение каждых четырех строк в 1 - PullRequest
1 голос
/ 13 июля 2020

, так что у меня есть файл CSV, который я импортировал в R studio. Я провел анализ, а затем мне сообщили, что при сборе данных произошла ошибка. Каждые 4 строки фактически представляют 1 месяц, и мне нужно объединить каждые 4 строки в 1 для каждой из 6 переменных. Данные выглядят так:

             X2   X3   X4   X5   X6   X7
1          3830    0    0 1184    0 5765
2             0    0  153    0  153  153
3             0    0    0   73   73    0
4             0    0  153    0  153    0
5          3815    0 3354  651  903 5174
6             0    0  138  101  273  558
7             0    0  322    0  272  322
8             0    0    0  101  273  420
9             0    0 3682 3302   83 6485
10          165    0   63    0  293  165
11            0    0   98   98    0    0
12            0    0    0    0  230    0

Итак, в основном я хочу, чтобы строки 1,2,3,4 объединены в одну новую строку. 5,6,7,8 в другой et c. Как проще всего go сделать это в R ???

Ответы [ 4 ]

3 голосов
/ 13 июля 2020

Если мы хотим группировать каждые 4 строки, создайте столбец группировки с gl и используйте aggregate, чтобы получить sum всех столбцов (при условии, что они все numeric) относительно столбец группировки

df1$grp <- as.integer(gl(nrow(df1), 4, nrow(df1)))
aggregate(.~ grp, df1, FUN = sum,  na.rm = TRUE)
#  grp   X2 X3   X4   X5   X6   X7
#1   1 3830  0  306 1257  379 5918
#2   2 3815  0 3814  853 1721 6474
#3   3  165  0 3843 3400  606 6650

данные

df1 <- structure(list(X2 = c(3830L, 0L, 0L, 0L, 3815L, 0L, 0L, 0L, 0L, 
165L, 0L, 0L), X3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L), X4 = c(0L, 153L, 0L, 153L, 3354L, 138L, 322L, 0L, 3682L, 
63L, 98L, 0L), X5 = c(1184L, 0L, 73L, 0L, 651L, 101L, 0L, 101L, 
3302L, 0L, 98L, 0L), X6 = c(0L, 153L, 73L, 153L, 903L, 273L, 
272L, 273L, 83L, 293L, 0L, 230L), X7 = c(5765L, 153L, 0L, 0L, 
5174L, 558L, 322L, 420L, 6485L, 165L, 0L, 0L)), class = "data.frame", 
row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))
3 голосов
/ 13 июля 2020

Вот подход с dplyr, который полагается на сначала создание вектора для суммирования. Затем мы используем group_by by, чтобы идентифицировать строки для агрегирования. Наконец, мы используем across для выполнения действия со всеми столбцами.

library(dplyr) #Version >= 1.0.0
result <- data %>%
            mutate(Aggregate = rep(seq(1,ceiling(nrow(data)/4)),each = 4)) %>%
            group_by(Aggregate) %>%
            summarise(across(everything(), sum))
result
# A tibble: 3 x 7
#  Aggregate    X2    X3    X4    X5    X6    X7
#      <int> <int> <int> <int> <int> <int> <int>
#1         1  3830     0   306  1257   379  5918
#2         2  3815     0  3814   853  1721  6474
#3         3   165     0  3843  3400   606  6650

Если вы используете старую версию dplyr, вы можете сделать это:

data %>%
  mutate(Aggregate = rep(seq(1,ceiling(nrow(data)/4)),each = 4)) %>%
  group_by(Aggregate) %>%
  summarise_all(sum)

Данные

data <- structure(list(X2 = c(3830L, 0L, 0L, 0L, 3815L, 0L, 0L, 0L, 0L, 
165L, 0L, 0L), X3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L), X4 = c(0L, 153L, 0L, 153L, 3354L, 138L, 322L, 0L, 3682L, 
63L, 98L, 0L), X5 = c(1184L, 0L, 73L, 0L, 651L, 101L, 0L, 101L, 
3302L, 0L, 98L, 0L), X6 = c(0L, 153L, 73L, 153L, 903L, 273L, 
272L, 273L, 83L, 293L, 0L, 230L), X7 = c(5765L, 153L, 0L, 0L, 
5174L, 558L, 322L, 420L, 6485L, 165L, 0L, 0L)), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"), class = "data.frame")
2 голосов
/ 13 июля 2020

data.table версия акруна aggregate ответ

library(data.table)
setDT(df)

df[, lapply(.SD, sum), by = .(grp = df[, gl(.N, 4, .N)])]
#    df   X2 X3   X4   X5   X6   X7
# 1:  1 3830  0  306 1257  379 5918
# 2:  2 3815  0 3814  853 1721 6474
# 3:  3  165  0 3843 3400  606 6650
0 голосов
/ 13 июля 2020

Вы можете попробовать:

library(tidyverse)
#Data

df <- structure(list(X2 = c(3830L, 0L, 0L, 0L, 3815L, 0L, 0L, 0L, 0L, 
165L, 0L, 0L), X3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L), X4 = c(0L, 153L, 0L, 153L, 3354L, 138L, 322L, 0L, 3682L, 
63L, 98L, 0L), X5 = c(1184L, 0L, 73L, 0L, 651L, 101L, 0L, 101L, 
3302L, 0L, 98L, 0L), X6 = c(0L, 153L, 73L, 153L, 903L, 273L, 
272L, 273L, 83L, 293L, 0L, 230L), X7 = c(5765L, 153L, 0L, 0L, 
5174L, 558L, 322L, 420L, 6485L, 165L, 0L, 0L)), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"), class = "data.frame")

#Create index
index <- seq(1,dim(df)[1],by=4)
index2 <- 1:length(index)
#Create empty var
df$index <- NA
df$index[index] <- index2
#Now fill
df %>% fill(index) %>% group_by(index) %>% summarise_all(sum,na.rm=T)

# A tibble: 3 x 7
  index    X2    X3    X4    X5    X6    X7
  <int> <int> <int> <int> <int> <int> <int>
1     1  3830     0   306  1257   379  5918
2     2  3815     0  3814   853  1721  6474
3     3   165     0  3843  3400   606  6650
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...