我有一个看起来像这样的数据框:
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对。
我正在尝试将dplyr
和group_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_by
和filter
,然后根据Name将它们重新组合在一起,但我想知道如果有人可以提供更直接的解决方案。也许与summarise
有什么关系?
谢谢!
编辑:更正了表中缺少的NA值。
答案 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
。