r - 通过通用标识符合并复杂的 data.frame 行

标签 r dplyr

example <- structure(list(id = c(1, 1, 2, 2, 3, 3, 4), var1 = c(5, NA, 8, 
9, 10, NA, 3), var2 = c(23, NA, 8, 9, NA, NA, 6), var3 = c(NA, 
NA, NA, NA, NA, NA, NA), var4 = c(5, 5, 6, 6, 7, 7, 8)), row.names = c(NA, 
-7L), class = "data.frame")

我有一个庞大而复杂的数据框,其中相同的度量可能会出现多次,并且同一度量的不同条目可能包含不同的数据。我在上面创建了一个简化的示例。我想做的就是尽可能地将其合并。我认为如果我引用这个例子,对我来说最容易解释:

print(example)

  id var1 var2 var3 var4
1  1    5   23   NA    5
2  1   NA   NA   NA    5
3  2    8    8   NA    6
4  2    9    9   NA    6
5  3   10   NA   NA    7
6  3   NA   NA   NA    7
7  4    3    6   NA    8
  • 如果变量存在于具有 ID 的行中,但在另一行中为 NA,则始终采用非 NA 值
  • 如果变量的值在 ID 的所有实例中都相同,则使用此值
  • 如果两行具有相同的 ID,但单个变量的值不同,则它们将保留为两个不同的行
  • 如果该变量在具有某个 ID 的所有行中均为 NA,则该 ID 在最终数据帧中该变量的值为 NA

因此,所需的输出如下所示:

  id var1 var2 var3 var4
1  1    5   23   NA    5
2  2    8    8   NA    6
3  2    9    9   NA    6
4  3   10   NA   NA    7
5  4    3    6   NA    8

StackOverflow 上有类似的问题,但没有一个问题同时处理所有这些功能。我最接近的是:

example %>% 
   group_by(id) %>% 
   summarise_all(funs(list(na.omit(.))))

     id var1      var2      var3      var4     
  <dbl> <list>    <list>    <list>    <list>   
1     1 <dbl [1]> <dbl [1]> <lgl [0]> <dbl [2]>
2     2 <dbl [2]> <dbl [2]> <lgl [0]> <dbl [2]>
3     3 <dbl [1]> <dbl [0]> <lgl [0]> <dbl [2]>
4     4 <dbl [1]> <dbl [1]> <lgl [0]> <dbl [1]>

这基本上是我想要的,但是将所有内容都放入列表中,这阻碍了数据帧的任何下游工作。例如,我得到的不是 ID 2 的两行,而是单行,其中包含 var1 的 8 和 9 的列表。对于匹配变量也会发生这种情况:对于 ID1, var4,您会得到一个包含 5, 5 的列表。

最佳答案

您可以执行此操作。对于每一列和id,您只能保留唯一非NA值,

library(dplyr)

example %>% 
  group_by(id) %>% 
  summarise(across(.fns = ~{x <- unique(na.omit(.));x[1:max(1, length(x))]}))
  #With summarise_all you can do
  #summarise_all(~{x <- unique(na.omit(.));x[1:max(1, length(x))]})


#    id  var1  var2 var3   var4
#  <dbl> <dbl> <dbl> <lgl> <dbl>
#1     1     5    23 NA        5
#2     2     8     8 NA        6
#3     2     9     9 NA        6
#4     3    10    NA NA        7
#5     4     3     6 NA        8

关于r - 通过通用标识符合并复杂的 data.frame 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63248626/

相关文章:

r - 日期作为因子的错误转换为日期

r - ggplot 和 dplyr 以及列名作为字符串

r - 将 mutate_at 与 mutate_if 一起使用

r - 使用间隔来确定日期列是否在其他日期的向量内

根据 R 中特定列中的值替换所有行值

r - 如何使用 summarise_each 计算加权平均值?

r - 在 plm 数据框中创建滞后、超前和差异变量

android - 是否可以使用 R 编程语言进行 Android 开发?

R的长度较大时,R不接受插入向量

r - 在 sqldf 语句中应用 CASE WHEN 来操作多列