как объединить данные между строками data.frame на основе идентичных значений столбцов, для data.frames с несколькими форматами столбцов - PullRequest
0 голосов
/ 30 мая 2019

У меня есть необработанные данные в формате df ниже, которые мне нужно сжать в меньшее количество строк data.frame. Данные представляют собой возможные данные точек ГИС (столбцы для координат здесь опущены), поэтому я надеюсь избежать нанесения дублирующих точек. Каждая строка представляет одну точку, для которой один или оба агентства agency1 и agency2 публикуют данные. Ответ на более простой случай с меньшим количеством форматов столбцов здесь .

Для случаев, когда есть строки с одинаковыми agency3_id, я бы хотел сжать эти две строки в одну строку. Как пример, я хочу, чтобы строки 3 и 4 в исходном data.frame (у обоих обоих agency3_id abcde) стали одной строкой в ​​желаемом data.frame ниже (его строка 3). Я открыт для любого метода R. Я уверен, что есть лучший вопрос названия - любая помощь приветствуется.

library(tidyverse)
library(lubridate)

agency1_id   <- as.double(c("1500", NA, "2007", NA, "4501", NA))
agency2_id   <- c(NA, "zxc", NA, "xcv", NA, "bnm")
agency3_id   <- c("qwert", "ertyu", "abcde", "abcde", NA, NA)
agency1_val  <- c(0.21, 1.5, 0.23, NA, 4.3, NA)
agency2_val  <- c(0.05, 4.4, NA, 6.3, NA, 2.0)
agency1_desc <- c("st", NA, "ko", NA, "ui", NA)
agency2_desc <- c(NA, "lo", NA, "vf", NA, "kl")
agency1_dtm  <- ymd_hm(c("2019-05-30 04:30", NA, "2019-05-30 04:35", 
                          NA, "2019-05-30 04:33", NA))
agency2_dtm  <- ymd_hm(c(NA, "2019-05-30 04:20", NA, "2019-05-30 
                          04:29", NA, "2019-05-30 04:31"))

df <- data.frame(agency1_id, agency2_id, agency3_id, agency1_val,
                 agency2_val, agency1_desc, agency2_desc, agency1_dtm,
                 agency2_dtm)
as_tibble(df)

# agency1_id agency2_id agency3_id agency1_val agency2_val agency1_desc agency2_desc agency1_dtm         agency2_dtm        
# <dbl>      <fct>      <fct>       <dbl>       <dbl>        <fct>        <fct>        <dttm>              <dttm>             
# 1 1500       NA         qwert      0.21        0.05        st           NA           2019-05-30 04:30:00 NA                 
# 2 NA         zxc        ertyu      1.5         4.4         NA           lo           NA                  2019-05-30 04:20:00
# 3 2007       NA         abcde      0.23         NA         ko           NA           2019-05-30 04:35:00 NA                 
# 4 NA         xcv        abcde       NA         6.3         NA           vf           NA                  2019-05-30 04:29:00
# 5 4501       NA         NA         4.3          NA         ui           NA           2019-05-30 04:33:00 NA                 
# 6 NA         bnm        NA          NA         2           NA           kl           NA                  2019-05-30 04:31:00

желаемый df:

# agency1_id agency2_id agency3_id agency1_val agency2_val agency1_desc agency2_desc agency1_dtm         agency2_dtm        
# <dbl>      <fct>      <fct>       <dbl>       <dbl>        <fct>        <fct>        <dttm>              <dttm>             
# 1 1500       NA         qwert      0.21        0.05        st           NA           2019-05-30 04:30:00 NA                 
# 2 NA         zxc        ertyu      1.5         4.4         NA           lo           NA                  2019-05-30 04:20:00
# 3 2007       xcv        abcde      0.23        6.3         ko           vf           2019-05-30 04:35:00 2019-05-30 04:29:00                 
# 4 4501       NA         NA         4.3          NA         ui           NA           2019-05-30 04:33:00 NA                 
# 5 NA         bnm        NA          NA         2           NA           kl           NA                  2019-05-30 04:31:00

1 Ответ

1 голос
/ 30 мая 2019

Вы можете использовать это. Не может быть самым кратким решением.

# Data with NA values in column - agency3_id
df_na <- df[is.na(df$agency3_id), ]

# Logic
df <- df[!is.na(df$agency3_id), ] %>% 
  group_by(agency3_id) %>% 
  summarise_all(list(~ if(all(is.na(.))) NA else .[!is.na(.)][1]))

# Merge dataframes
rbind(df, df_na)
# Result
# A tibble: 5 x 9
  agency3_id agency1_id agency2_id agency1_val agency2_val agency1_desc agency2_desc agency1_dtm        
* <fct>           <dbl> <fct>            <dbl>       <dbl> <fct>        <fct>        <dttm>             
1 abcde            2007 xcv               0.23        6.3  ko           vf           2019-05-30 04:35:00
2 ertyu              NA zxc               1.5         4.4  NA           lo           NA                 
3 qwert            1500 NA                0.21        0.05 st           NA           2019-05-30 04:30:00
4 NA               4501 NA                4.3        NA    ui           NA           2019-05-30 04:33:00
5 NA                 NA bnm              NA           2    NA           kl           NA                 
# … with 1 more variable: agency2_dtm <dttm>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...