【问题标题】:R script merge 2 rowsR脚本合并2行
【发布时间】:2019-03-22 10:12:37
【问题描述】:

我有一个数据框,例如:

       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

like a group by (a,b),为 c 和 d 选择 min Date,为 e 选择 max,为 f 和 g 选择 non-null

如何在 R 中解决它?

【问题讨论】:

  • 请使用dput和逻辑分享数据
  • 我想按 (a,b) 分组选择 c 上的最小日期,d 上选择 e 上的最大数字 在 f 和 g 上选择非空
  • 模式是什么。在 col d 中,您采用第二个值。在 col c 你取第一行
  • 我选择最低日期

标签: r dataframe merge row


【解决方案1】:

使用dplyr我们可以group_byab,将cd转换为实际日期使用dmylubridate并选择最小日期,选择maximum e 的值和 fg 的非 NA 值。

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】:

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

    【讨论】:

    • min 不适用于日期。 (列cd)。在这里它可以工作,因为min(c("01", "07")) 给你“01”,但它会给你意想不到的结果min(c("11", "7"))。您需要先将其转换为日期才能使用minmax 函数。
    【解决方案3】:

    使用数据表。我不得不更改你的一个日期,因为没有 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")
         ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2019-03-30
      • 2012-01-24
      • 2022-11-05
      • 2011-01-09
      相关资源
      最近更新 更多