Оставить строку 1 без изменений. Объединить следующие три. - PullRequest
0 голосов
/ 14 июля 2020

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

             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. Итак, допустим, для столбца 76 мне нужна новая строка, в которой указано 5765 для строки 1, а затем 13 для строки суммы 2–4. Как проще всего go сделать это в R?

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вот небольшой вариант моего ответа на ваш предыдущий вопрос , в котором используется настраиваемая лямбда-функция.

В нестандартной оценке Tidyverse оператор ~ похож на function(...) . Символ . позже представляет первый аргумент. Таким образом, .[1] представляет первый элемент, а .[2:4] представляет следующие 3. Поэтому, когда наша лямбда-функция применяется к вектору каждого столбца, мы можем использовать rbind, чтобы вернуть матрицу из 1 столбца и 2 строк. summarize услужливо объединяет результаты всех столбцов в две строки для каждой группы.

library(dplyr)
data %>%
  mutate(Aggregate = rep(seq(1,ceiling(nrow(data)/4)),each = 4)) %>%
  group_by(Aggregate) %>%
  summarise(across(everything(), ~rbind(.[1], sum(.[2:4]))))
## A tibble: 6 x 7
## Groups:   Aggregate [3]
#  Aggregate X2[,1] X3[,1] X4[,1] X5[,1] X6[,1] X7[,1]
#      <int>  <int>  <int>  <int>  <int>  <int>  <int>
#1         1   3830      0      0   1184      0   5765
#2         1      0      0    306     73    379    153
#3         2   3815      0   3354    651    903   5174
#4         2      0      0    460    202    818   1300
#5         3      0      0   3682   3302     83   6485
#6         3    165      0    161     98    523    165
2 голосов
/ 14 июля 2020

Попробуйте следующее:

library(tidyverse)
#Create index
index <- seq(1,dim(df)[1],by=4)
num <- 1:length(index)
#Assign
df$var <- NA
df$var2 <- NA
df$var[index]<-num
df %>% fill(var) -> df
df$var2[index]<-rep(1,length(index))
df$var2 <- ifelse(is.na(df$var2),2,df$var2)
#Mutate aggregations
df %>% group_by(var,var2) %>% summarise_all(sum,na.rm=T)

# A tibble: 6 x 8
# Groups:   var [3]
    var  var2    X2    X3    X4    X5    X6    X7
  <int> <dbl> <int> <int> <int> <int> <int> <int>
1     1     1  3830     0     0  1184     0  5765
2     1     2     0     0   306    73   379   153
3     2     1  3815     0  3354   651   903  5174
4     2     2     0     0   460   202   818  1300
5     3     1     0     0  3682  3302    83  6485
6     3     2   165     0   161    98   523   165
...