通过将行与 R 中的匹配属性绑定来替换缺失的 "NA" 值

Replace missing "NA" values by binding rows with matching attributes in R

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

  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

请原谅我的复杂性,但我希望解决方案适用于我的实际应用。如您所见,行的重复条目(例如 Albania 2015)导致变量观察值分布在多行中。我希望在前两列(国家和年份)中绑定具有匹配字符串值的行,并将展开的变量值 (C-H) 统一到一行中。最后,数据框应该是这样的:

  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' 和 summarise 其余列与其中一个函数 max/sum/min 分组,因为只有一个非每个 column/group

的 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

数据

df1 <- structure(list(A = c("Albania", "Albania", "Greece", "Greece", 
"Greece", "Greece", "Albania"), B = c(2015L, 2015L, 2016L, 2016L, 
2017L, 2017L, 2015L), C = c(10L, NA, 30L, NA, NA, 20L, NA), D = c(NA, 
NA, NA, 400L, 40L, NA, 200L), E = c(NA, 50L, 20L, NA, NA, 30L, 
NA), F = c(NA, NA, NA, 30L, NA, 30L, 40L), G = c(60L, NA, NA, 
30L, NA, 50L, NA), H = c(NA, 10L, NA, 10L, NA, 10L, NA)),
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7"))