使用dplyr获取数据帧的多个最大值

时间:2018-11-13 01:44:00

标签: r dplyr

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

  Name    Variable1 Value1 Variable2 Value2
1 Michael         A      2      <NA>     <NA>
2 Michael         B      3      <NA>     <NA>
3 Michael      <NA>   <NA>         X       10
4    John         B      5      <NA>     <NA>
5    John         E      3      <NA>     <NA>
6    John      <NA>    <NA>        Y      20
7    John      <NA>    <NA>        Z      40
8    Paul         C     10      <NA>     <NA>
9    Paul         D      5      <NA>     <NA>

在所有行中,都有一个Variable1 / Value1对或Variable2 / Value2对。 我正在尝试将dplyrgroup_by函数结合使用filter来生成一个数据帧,该数据帧具有(1)每个名称仅一行和(2)max-Value 1和2配对。在这种情况下,我的决赛桌看起来像这样:

     Name Variable1 Value1 Variable2 Value2
1 Michael         B      3         X     10
2    John         B      5         Z     40
3    Paul         C     10      <NA>   <NA>

我似乎无法获得正确的分组流程来正确执行此操作。我想到的一种解决方案是将数据帧分为两对,过滤,分别使用group_byfilter,然后根据Name将它们重新组合在一起,但我想知道如果有人可以提供更直接的解决方案。也许与summarise有什么关系?

谢谢!

编辑:更正了表中缺少的NA值。

1 个答案:

答案 0 :(得分:1)

library(dplyr)

df[is.na(df)] <- 0

df1 <-
  df %>%
  select(1:3)

df1_max <-
  df %>%
  group_by(Name) %>%
  summarise(Value1 = max(Value1))

df2 <-
  df %>%
  select(c(1, 4:5))

df2_max <-
  df %>%
  group_by(Name) %>%
  summarise(Value2 = max(Value2))

result <- left_join(
  left_join(df1_max, df1),
  left_join(df2_max, df2) %>%
    distinct()
) %>%
  select(c(1, 3, 2, 5, 4))

result[result == 0] <- NA

结果:

result

# A tibble: 3 x 5
  Name    Variable1 Value1 Variable2 Value2
  <chr>   <chr>      <dbl> <chr>      <dbl>
1 John    B              5 Z             40
2 Michael B              3 X             10
3 Paul    C             10 <NA>          NA

注释:

  • 在数据帧中,一行中的元素不是彼此独立的。因此,您不应该使它们彼此分离。但这是您要尝试执行的操作,因为Variable1的最大值和Variable2的最大值不在同一行,但是您希望您的结果具有每个的最大值(因此创建您的原始数据框中不存在的一行)。这就是为什么我将您的数据帧分成2个,然后将它们与联接重新关联的原因。

  • NA和一个值的最大值为NA(由于缺少NA,我们不知道它是什么值,所以我们不知道最大值是多少)。但是,您认为NA不如任何价值。由于这不是R的工作方式,因此我不得不将0分配给您的NA以获得您认为的最大值,然后最后将NA分配给0

  • 您的数据中缺少两个值,我认为它们是NA