R скрипт объединяет 2 строки - PullRequest
0 голосов
/ 22 марта 2019

У меня есть один фрейм данных как:

       a   b      c       d       e    f   g  
 1     Car 10/02  01/02   30/02   14   1   NA
 2     Car 10/02  07/02   20/02    0   NA   7

Я хочу получить:

       a   b      c       d       e    f   g  
 1     Car 10/02  01/02   20/02   14   1   7

Подобно группе (a, b), выберите минимальную дату для c и d, выберите максимальную для e и выберите ненулевое значение для f и g

Как я могу решить это в R?

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

Используя dplyr, мы можем group_by a и b, конвертировать c и d в фактические даты, используя dmy из lubridate и выберите минимальную дату, выберите max imumзначение e и значение не-NA f и g.

library(dplyr)
library(lubridate)

df %>%
  group_by(a, b) %>%
  summarise(c = c[which.min(dmy(paste0(c, "/19")))], 
             d = d[which.min(dmy(paste0(d, "/19")))], 
             e = max(e), 
             f = f[!is.na(f)], 
             g = g[!is.na(g)])

#   a     b     c     d         e     f     g
#  <fct> <fct> <fct> <fct>   <dbl> <int> <int>
#1 Car   10/02 01/02 20/02    14     1     7

Как показано в примере, я предполагаю, что у вас будет только одно значение не-NA для fи g если у вас их больше одного, используйте which.max, чтобы выбрать первое значение, отличное от NA, из этих столбцов.

0 голосов
/ 22 марта 2019

Используйте библиотеку dplyr, скажем, ваш фрейм данных df.Прежде всего, замените NA на 0

df[is.na(df)] <- 0 # you can now directly take sum of f and g column in group by
library(dplyr)
df_1 <- df %>% group_by(a,b) %>% summarise(c = min(c),d = min(d),e = max(e),f = sum(f),g = sum(g))
0 голосов
/ 22 марта 2019

с использованием data.table.Я должен был изменить одну из ваших дат, потому что нет 30 февраля

    x <-  data.frame( 
     a= c( "Car","Car"), b=c("10/20","10/20"), c=c("01/02","07/02"),d=c("28/02","20/02"), e=c(14,0), f=c(1, NA), g=c(NA,7)) 

     library( data.table) # you may need to install
     x <- data.table( x )

#convert to dates
     x$c <- as.Date(x$c, "%d/%m")
     x$d <- as.Date(x$d, "%d/%m")

# group as you specfied
     x[ ,

         .(
             c = min( c ),
             d = min( d ),
             e = max( e ),
             f= max( f , na.rm=T),
             g= max( g , na.rm=T)
         ) ,

     by= c( "a","b")
     ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...