R脚本合并2行

时间:2019-03-22 10:12:38

标签: r dataframe merge row

我有一个像这样的数据框:

       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选择非null

如何在R中解决它?

3 个答案:

答案 0 :(得分:0)

使用data.table。我必须更改您的约会日期之一,因为2月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")
     ]

答案 1 :(得分:0)

使用dplyr,我们可以group_by ab,使用cddmy转换为实际日期, lubridate并选择最短日期,选择max的最大值e和非NA值fg

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

如示例中所示,假设fg仅具有一个非NA值,如果您有多个,则使用which.max选择第一个这些列中的非NA值。

答案 2 :(得分:0)

使用库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))