【问题标题】:compare two dataframes and get maximum values比较两个数据帧并获得最大值
【发布时间】:2019-10-07 06:27:36
【问题描述】:

我正在尝试比较具有相同结构(相同维度、列名、行名等)的两个数据帧(df1、df2)并保持两个数据帧之间的最大值。我实际上有数百列和行,但这里有一些假数据:

df1:
Date       Fruit  Num  Color 
2013-11-24 Banana 2 Yellow
2013-11-24 Orange  8 Orange
2013-11-24 Apple   7 Green
2013-11-24 Celery 10 Green

df2:
Date       Fruit  Num  Color 
2013-11-24 Banana 22 Yellow
2013-11-24 Orange  8 Orange
2013-11-24 Apple   7 Green
2013-11-24 Celery 1 Green

有很多关于 SO 做类似事情的例子,但在 python 中不是 R: Comparing two dataframes and getting the differences, Compare two dataframes to get comparison value in in another dataframe 等等

我尝试了 dplyr 方法,但我不知道如何为所有列(数百列)正确执行此操作。

library(dplyr)
test <- rbind(df1, df2)
test2 <- test %>%
  group_by(Date) %>%
summarise(max = max(.))

鉴于我上面的假数据,所需的输出应该是:

new.df:
Date       Fruit  Num  Color 
2013-11-24 Banana 22 Yellow
2013-11-24 Orange  8 Orange
2013-11-24 Apple   7 Green
2013-11-24 Celery 10 Green

感谢您的帮助。

【问题讨论】:

  • 您可以按日期、水果和颜色将表格连接在一起,然后 mutate 一个具有两个 Num 值最大值的新列。
  • 这听起来也是一个不错的方法 - 我会看看我是否能弄清楚如何......

标签: r dataframe dplyr


【解决方案1】:

试试这个:

test %>%
  group_by_if(.,is.factor) %>%
  summarise_if(is.numeric, max)

# A tibble: 4 x 4
# Groups:   Date, Fruit [?]
  Date       Fruit  Color    Num
  <fct>      <fct>  <fct>  <dbl>
1 2013-11-24 Apple  Green      7
2 2013-11-24 Banana Yellow    22
3 2013-11-24 Celery Green     10
4 2013-11-24 Orange Orange     8

【讨论】:

  • @Jiber Urbina 这有没有办法使用这种方法而不必按名称指定每一列?在我的情况下不可能,因为我有数百列..
  • @KNN,是的,有!看我的编辑。只需使用group_by_if()
【解决方案2】:

一种可能性是按所有非数字列分组,然后获取数字列的最大值:

library(tidyverse)

rbind(df1, df2) %>%
    group_by_at(vars(one_of(names(select_if(df2,negate(is.numeric)))))) %>%
    summarise_if(is.numeric, max)

#> # A tibble: 4 x 4
#> # Groups:   Date, Fruit [4]
#>   Date       Fruit  Color    Num
#>   <fct>      <fct>  <fct>  <dbl>
#> 1 2013-11-24 Apple  Green      7
#> 2 2013-11-24 Banana Yellow    22
#> 3 2013-11-24 Celery Green     10
#> 4 2013-11-24 Orange Orange     8

reprex package (v0.2.1) 于 2019-05-20 创建

您也可以尝试加入两个数据框,然后保持最大值:

df1 %>% right_join(df2, by=c("Date","Fruit","Color")) %>% 
        mutate(Num = pmax(Num.x, Num.y)) %>% select(-Num.x, -Num.y)

【讨论】:

  • 太棒了!我在 rbind 之后做了一个 group_by ,然后是你的回答,这似乎工作得很好。谢谢大家的回复。
【解决方案3】:

或者试试

set.seed(1234) 
df1 = data.frame(x1=runif(10),x2= 10*runif(10))
df2 = data.frame(x1=runif(10),x2= 20*(runif(10)-0.5))

(df1$x2 >= df2$x2)* df1$x2 + (df1$x2 < df2$x2)* df2$x2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多