“替换缺失的”;不适用;通过在R中绑定具有匹配属性的行来获取值

“替换缺失的”;不适用;通过在R中绑定具有匹配属性的行来获取值,r,bind,missing-data,R,Bind,Missing Data,我正在处理一个有一些清洁问题的大型数据集。为了你的理智,我举了一个更简单的例子。假设数据集如下所示: A B C D E F G H 1 Albania 2015 10 NA NA NA 60 NA 2 Albania 2015 NA NA 50 NA NA 10 3 Greece 2016 30 NA 20 NA N

我正在处理一个有一些清洁问题的大型数据集。为了你的理智,我举了一个更简单的例子。假设数据集如下所示:

  A        B       C     D     E     F     G     H
1 Albania  2015    10    NA    NA    NA    60    NA
2 Albania  2015    NA    NA    50    NA    NA    10
3 Greece   2016    30    NA    20    NA    NA    NA
4 Greece   2016    NA   400    NA    30    30    10
5 Greece   2017    NA    40    NA    NA    NA    NA
6 Greece   2017    20    NA    30    30    50    10
7 Albania  2015    NA   200    NA    40    NA    NA
  A           B     C     D     E     F     G     H
1 Albania  2015    10   200    50    40    60    10
2 Greece   2016    30   400    20    30    30    10
3 Greece   2017    20    40    30    30    50    10
请原谅我的复杂性,但我希望有一个解决方案能适合我的实际应用。如您所见,行的重复条目(如阿尔巴尼亚2015)导致变量观测分布在多行中。我希望在前两列(国家和年份)中使用匹配的字符串值绑定行,并将分散变量值(C-H)统一到一行中。最后,数据框应如下所示:

  A        B       C     D     E     F     G     H
1 Albania  2015    10    NA    NA    NA    60    NA
2 Albania  2015    NA    NA    50    NA    NA    10
3 Greece   2016    30    NA    20    NA    NA    NA
4 Greece   2016    NA   400    NA    30    30    10
5 Greece   2017    NA    40    NA    NA    NA    NA
6 Greece   2017    20    NA    30    30    50    10
7 Albania  2015    NA   200    NA    40    NA    NA
  A           B     C     D     E     F     G     H
1 Albania  2015    10   200    50    40    60    10
2 Greece   2016    30   400    20    30    30    10
3 Greece   2017    20    40    30    30    50    10

有人能帮我找到解决办法吗?谢谢

我们可以按“A”、“B”和
对其余列进行分组,并使用其中一个函数
max/sum/min
对其进行汇总,因为每个列/组只有一个非NA元素

library(dplyr)
df1 %>%
    group_by(A, B) %>%
    summarise_at(vars(-group_cols()), ~ if(all(is.na(.))) NA
         else max(., na.rm = TRUE))

# A tibble: 3 x 8
# Groups:   A [2]
#  A           B     C     D     E     F     G     H
#  <chr>   <int> <int> <int> <int> <int> <int> <int>
#1 Albania  2015    10   200    50    40    60    10
#2 Greece   2016    30   400    20    30    30    10
#3 Greece   2017    20    40    30    30    50    10
库(dplyr)
df1%>%
(A,B)组%>%
总结(vars(-group_cols()),~if(all(is.na())na
else最大值(,不适用于rm=TRUE))
#一个tibble:3x8
#分组:A[2]
#A B C D E F G H
#           
#1阿尔巴尼亚2015 1020050406010
#2希腊2016 30 400 20 30 10
#3希腊2017 20 40 30 50 10
数据
df1这个成功了!最后一个问题——如果同一个匹配错误地有两个不同的值/重复条目,会发生什么?有没有办法在默认情况下只选择一个值(例如,最大/最小值)?@TiberiusGracchus2020
max
将通过以下方式选择单个
max
值:default@TiberiusGracchus2020您可以检查
max(c(50,50,20,NA),NA.rm=TRUE)
@TiberiusGracchus2020更新了注释