сравнить два кадра данных и получить максимальные значения - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь сравнить два фрейма данных (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: Сравнение двух фреймов данных и получение различий , Сравните два кадра данных, чтобы получить значение сравнения в другом кадре данных и т.д.

Я попробовал подход 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

Спасибо за помощь.

Ответы [ 3 ]

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

Одна возможность - сгруппировать по всем нечисловым столбцам, а затем получить максимум для числовых:

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

Создано в 2019-05-20 пакетом представ. (v0.2.1)

Вы также можете попробовать объединить два кадра данных и сохранить максимальные значения:

df1 %>% right_join(df2, by=c("Date","Fruit","Color")) %>% 
        mutate(Num = pmax(Num.x, Num.y)) %>% select(-Num.x, -Num.y)
1 голос
/ 21 мая 2019

Попробуйте это:

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
0 голосов
/ 21 мая 2019

или попробуйте

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...