Как использовать group_by больше условного?

У меня есть группа данных (здесь субобразец)

df1

Я группировал их используя group_by

df2<-df1 %>%
  group_by(rebl, año, mes) %>% 
  summarize(n()) %>% 
  rowid_to_column("ram")

Таким образом что я сейчас имею

df2

Поскольку они могут видеть, есть какие-то комбинации, которые у них есть n <=10 и я должен перераспределять их в другой группе через тот же год. Например

ram     rebl          año     mes     n()

3      01020010068    2014    2        9
4      01020010068    2014    3        6

Идея состояла бы в том, чтобы перераспределять или складывать эти два ram в группу

ram     rebl          año     mes     n()

2      01020010068    2014    1        12

Таким образом что ram 3 и 4 уже не существовали больше, и что ram 2 имел n=27.

Я попробовал делать это используя

 if (df1$n<=10) df1 %>% group_by(rebl, año) %>% summarize(n()) 
else if (df1$n>=10) df1 %>% group_by(rebl, año, mes) %>% summarize(n())

Но у меня выходит ошибка: "the condition существуешь length> 1 and only the first element will be used"

Как могло бы делать перераспределение, в котором я нуждаюсь?

1
задан 21.03.2019, 11:59
1 ответ

Рассуждения

, Поскольку консультация специфическая, и sГіlo я считаю с частичными данными, что, чтобы проверять, а именно, выполнимость обобщения ее soluciГіn, что уходит, есть выставлять continuaciГіn, возьму данные df2, чтобы подробно описывать решенное:

library(dplyr)
#library(tibble) # no es necesario trabajar en este caso con la funcion: rowid_to_column
library(tidyr)
df2<-data.frame(ram=1:13,
                rebl=c(rep("010020010068",13)),
                año=c(2013, 2014, 2014, 2014, 2014, 2015, 2015, 2016, 2016, 2016, 2017, 2017,2017),
                mes=c(12, 1, 2, 3, 11, 1, 2, 1, 2, 3, 1, 2, 3),
                n=c(78,12,9,6,11,9,7,19,14,10,31,19,9)
)
df2

   ram         rebl  año mes  n
1    1 010020010068 2013  12 78
2    2 010020010068 2014   1 12
3    3 010020010068 2014   2  9
4    4 010020010068 2014   3  6
5    5 010020010068 2014  11 11
6    6 010020010068 2015   1  9
7    7 010020010068 2015   2  7
8    8 010020010068 2016   1 19
9    9 010020010068 2016   2 14
10  10 010020010068 2016   3 10
11  11 010020010068 2017   1 31
12  12 010020010068 2017   2 19
13  13 010020010068 2017   3  9

На soluciГіn

С данными, полученными от первой консультации - использовал n и не n() как имя колонны - нужен применять фильтр, чтобы отделять df2

с n<=10:

diezMe<-df2 %>% 
        group_by(rebl,año) %>% 
        filter(n<=10, año==first(año)) %>%
        summarise(n=sum(n)) %>% as.data.frame()
diezMe
          rebl  año  n
1 010020010068 2014 15
2 010020010068 2015 16
3 010020010068 2016 10
4 010020010068 2017  9

и с n>10

diezMy<-df2 %>% 
        group_by(rebl, año, mes) %>% 
        filter(n>10) %>%
        summarise(n)%>% as.data.frame()
diezMy
          rebl  año mes  n
1 010020010068 2013  12 78
2 010020010068 2014   1 12
3 010020010068 2014  11 11
4 010020010068 2016   1 19
5 010020010068 2016   2 14
6 010020010068 2017   1 31
7 010020010068 2017   2 19

Наблюдать, что diezMe ( меньшие или равные 10) не содержит колонну mes и в действительности не serГ - в значимый, потому что Ваша колонна n должна быть сложенной к diezMy$mes, но... aquГ - есть особенный случай:

diezMe содержит aГ±o 2015, взамен diezMy испытывает недостаток Г©l, в этом смысле, я снова отмечаю, эта soluciГіn sГіlo отвечает на поставленные данные, в любом случае, habrГ - в который видеть другие варианты, чтобы взбираться на нее soluciГіn.

, Чтобы решать предыдущее, - необходим захватывать первые месяцы каждый aГ±o ( в 2018 podrГ, - когда сходный случай иметься) и agregГЎrselos по отношению к diezMe из следующей формы:

diezMeMes<-aggregate(mes~ rebl+año , df2, FUN=head,1)
diezMe <- diezMe %>%
            mutate(mes=diezMeMes$mes[diezMeMes$año %in% año])%>%
            select(rebl, año, mes, n)
diezMe
          rebl  año mes  n
1 010020010068 2014   1 15
2 010020010068 2015   1 16
3 010020010068 2016   1 10
4 010020010068 2017   1  9

, Поскольку должна быть удача intersecciГіn ( inner_right ) между data.frame : diezMe и diezMy aГ±o 2015 - или другие aГ±os, - quedarГ - в в воздухе, в этом смысле, переходят в Ваш extracciГіn (fila o filas) из diezMe для последующей одной recuperaciГіn.

recuperar<-diezMe[!(diezMe$año %in%  diezMy$año),]
diezMe<-diezMe[diezMe$año %in%  diezMy$año,]
diezMe
          rebl  año mes  n
1 010020010068 2014   1 15
3 010020010068 2016   1 10
4 010020010068 2017   1  9

Ну, потом я имею один pequeГ±o прием, чтобы получать положения dГіnde они начинают их aГ±os, ввиду колонны - без того, чтобы они повторялись, - посредством бинарного вектора (cond):

diezMy$dif <- c(1, diezMy$año[-1] - diezMy$año[-length(diezMy$año)]) # siempre empieza en 1
diezMy$cond <- ifelse(diezMy$dif>0,1,0) # se genera un vector (columna) binario
diezMy$añoMod <- diezMy$año*diezMy$cond
diezMy
          rebl  año mes  n dif cond añoMod
1 010020010068 2013  12 78   1    1   2013
2 010020010068 2014   1 12   1    1   2014
3 010020010068 2014  11 11   0    0      0
4 010020010068 2016   1 19   2    1   2016
5 010020010068 2016   2 14   0    0      0
6 010020010068 2017   1 31   1    1   2017
7 010020010068 2017   2 19   0    0      0

Колонны dif, cond и añoMod - bГЎsicamente колонны помощи и не идут в конечном продукте, вышеупомянутые колонны tambiГ©n могут быть полученными посредством mutate, но мне казаться подходящим давать шаг за шагом в R основание, для того, чтобы смогли быть напечатанными соответствующие решения и видеть mГЎs в деталь Ваше поведение.

Центральная идея состоит в том, чтобы получать aГ±os без повторений и не теряя положений, где они начинают .

Также стоит доводить до сведения, что бинарная колонна cond смогла быть:

 c(TRUE, FALSE)*c(2013,2104) # se imprime [1] 2013 0

TambiГ©n хороший ограничивать quГ©, она disposiciГіn añoMod sГіlo он vГЎlida, если ищется добавлять суммы, полученные от diezMe$n в первый месяц aГ±o соответствующий в data.frame diezMy, потому что в этом особенном случае, представленные данные позволяют принимать это.

то, что он продолжает, состоит в том, чтобы складывать стоимость от diezMe$n до diezMy$n в них aГ±os соответствующие, для такого конца создается вспомогательный вектор (np), так как expresiГіn, который он производит в вектор verif, может размещаться внутри np, а следовательно Ваш construcciГіn (verif) опциональный. AquГ - деталь процедуры:

verif <- diezMy$añoMod %in% diezMe$año
verif
# [1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE

np<-(1:length(diezMy$n))*0
np[verif]<-diezMe$n
np
# [1]  0 15  0 10  0  9  0

diezMy$n<-diezMy$n+np
diezMy
          rebl  año mes  n dif cond añoMod
1 010020010068 2013  12 78   1    1   2013
2 010020010068 2014   1 27   1    1   2014
3 010020010068 2014  11 11   0    0      0
4 010020010068 2016   1 29   2    1   2016
5 010020010068 2016   2 14   0    0      0
6 010020010068 2017   1 40   1    1   2017
7 010020010068 2017   2 19   0    0      0

Оказавшийся

В конце концов нужен давать ему форму попросившему докладу, не прекращая включать ее (s) линия (s) хранившаяся (s) заблаговременно в recuperar

dfFinal<-diezMy[,1:4]
dfFinal[nrow(dfFinal)+1,]<-recuperar

dfFinal<-dfFinal[order(dfFinalMy$año),]
row.names(dfFinal) <- 1:nrow(dfFinal)

# RESULTADO FINAL
dfFinal
          rebl  año mes  n
1 010020010068 2013  12 78
2 010020010068 2014   1 27
3 010020010068 2014  11 11
4 010020010068 2015   1 16
5 010020010068 2016   1 29
6 010020010068 2016   2 14
7 010020010068 2017   1 40
8 010020010068 2017   2 19
1
ответ дан 02.12.2019, 05:21

Теги

Похожие вопросы