Слияние строк с одинаковым значением с условиями для хранения нескольких пустышек - PullRequest
1 голос
/ 31 октября 2019

Создание примера подмножества DF (код для части действительного в конце)

ANO_CENSO  PK_COD_TURMA  PK_COD_ENTIDADE  MAIS_ENSINO_FUND  MAIS_ENSINO_MED  ENSINO_INTEG_FUND  ENSINO_INTEG_MED  
2011       27            12               1                 0                0                  1
2011       41            12               1                 1                0                  0
2011       18            13               0                 0                0                  1
2011       16            14               1                 1                0                  1

Я хочу объединить строки с одинаковым значением PK_COD_ENTIDADE в одини сохраните значения «1» для манекенов с тем же PK_COD_ENTIDADE. Меня не волнуют разные значения в PK_COD_TURMA, не имеет значения, кто останется в финальном DF (27 или 41). У моего DF есть несколько переменных, таких как PK_COD_TURMA, которые меня не интересуют для конечного значения, важными являются PK_COD_ENTIDADE и макеты со значением "1". В конце это выглядело бы так:

ANO_CENSO  PK_COD_TURMA  PK_COD_ENTIDADE  MAIS_ENSINO_FUND  MAIS_ENSINO_MED  ENSINO_INTEG_FUND  ENSINO_INTEG_MED  
2011       27            12               1                 1                0                  1
2011       18            13               0                 0                0                  1
2011       16            14               1                 1                0                  1

Посмотрите, как у меня есть значения «1» для 2 манекенов в первом наблюдении PK_COD_ENTIDADE = 12 и еще одно значение «1» в другом манекене с PK_COD_ENTIDADE = 12, и в конце они слились в одно наблюдение для того же PK_COD_ENTIDADEдержа разные манекены "1" (и те же самые манекены с 1 для разных наблюдений не составляют 2, потому что они являются манекенами)

Я понятия не имею, как это сделать, я искал некоторые решения сdplyr, но не может применить что-либо близко к работе ...

Вот структура df со всеми переменными:

dftest2 <- structure(list(ANO_CENSO = c(2011, 2011, 2011, 2011), PK_COD_TURMA = c(27, 
                                                                   41, 18, 16), NU_DURACAO_TURMA = c(250, 255, 255, 
                                                                                                                 255), FK_COD_ETAPA_ENSINO = c(41, 19, 19, 19), PK_COD_ENTIDADE = c(12, 
                                                                                                                                                                                    12, 13, 14), FK_COD_ESTADO = c(11, 11, 11, 
                                                                                                                                                                                                                                     11), SIGLA = c("RO", "RO", "RO", "RO"), FK_COD_MUNICIPIO = c(1100023, 
                                                                                                                                                                                                                                                                                                  1100023, 1100023, 1100023), ID_LOCALIZACAO = c(1, 1, 1, 1), ID_DEPENDENCIA_ADM = c(2, 
                                                                                                                                                                                                                                                                                                                                                                                     2, 2, 2), MAIS_ENSINO_FUND = c(1, 1, 0, 1), MAIS_ENSINO_MED = c(0, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                     1, 0, 1), ENSINO_INTEG_FUND = c(0L, 0L, 0L, 0L), ENSINO_INTEG_MED = c(1L, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           0L, 1L, 1L)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           "data.frame"))

1 Ответ

1 голос
/ 31 октября 2019

Образцы данных, которые вы указываете для dftest2, не соответствуют данным, которые вы предоставляете в начале вашего сообщения.

В ответ на ваш вопрос можно использовать aggregate

aggregate(
    . ~ PK_COD_ENTIDADE, 
    data = transform(dftest2, SIGLA = as.factor(SIGLA)), 
    FUN = max)
#P  K_COD_ENTIDADE ANO_CENSO PK_COD_TURMA NU_DURACAO_TURMA FK_COD_ETAPA_ENSINO
#1              12      2011           41              255                  41
#2              13      2011           18              255                  19
#3              14      2011           16              255                  19
#  FK_COD_ESTADO SIGLA FK_COD_MUNICIPIO ID_LOCALIZACAO ID_DEPENDENCIA_ADM
#1            11     1          1100023              1                  2
#2            11     1          1100023              1                  2
#3            11     1          1100023              1                  2
#  MAIS_ENSINO_FUND MAIS_ENSINO_MED ENSINO_INTEG_FUND ENSINO_INTEG_MED
#1                1               1                 0                1
#2                0               0                 0                1
#3                1               1                 0                1

Объяснение: Сначала мы преобразуем столбец character SIGLA в factor;затем мы aggregate данных во всех столбцах (кроме PK_COD_ENTIDADE) на PK_COD_ENTIDADE и возвращаем значение max (которое должно соответствовать вашей постановке задачи).

Вы можете сделать что-то подобное, используяdplyr с group_by и summarise_all

library(dplyr)
dftest2 %>%
    group_by(PK_COD_ENTIDADE) %>%
    summarise_all(~ifelse(is.character(.x), last(.x), max(.x))) %>%
    ungroup()    
# A tibble: 3 x 14
  PK_COD_ENTIDADE ANO_CENSO PK_COD_TURMA NU_DURACAO_TURMA FK_COD_ETAPA_EN…
            <dbl>     <dbl>        <dbl>            <dbl>            <dbl>
1              12      2011           41              255               41
2              13      2011           18              255               19
3              14      2011           16              255               19
# … with 9 more variables: FK_COD_ESTADO <dbl>, SIGLA <chr>,
#   FK_COD_MUNICIPIO <dbl>, ID_LOCALIZACAO <dbl>, ID_DEPENDENCIA_ADM <dbl>,
#   MAIS_ENSINO_FUND <dbl>, MAIS_ENSINO_MED <dbl>, ENSINO_INTEG_FUND <int>,
#   ENSINO_INTEG_MED <int>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...