每个观察结果有多行数据,其中一些行中填充了变量,但其他行中没有

Data with multiple rows per observations with variables populated in some but not other rows

所以我有这个数据框:

dat1 <- data.frame(id=1:n, 
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=NA,
                  op=factor(paste0("op", 1:n)),
                  x=NA)
dat1
dat2 <- data.frame(id=1:n, 
                   group=rep(LETTERS[1:2], n/2),
                   age=NA,
                   type=factor(paste0("type", 1:n)),
                   op=NA, 
                   x=rnorm(n))
dat <- full_join(dat1,dat2) %>% arrange(id)
dat

   id group age  type   op           x
1   1     A  19  <NA>  op1          NA
2   1     A  NA type1 <NA>  0.18819303
3   2     B  29  <NA>  op2          NA
4   2     B  NA type2 <NA>  0.11916096
5   3     A  19  <NA>  op3          NA
6   3     A  NA type3 <NA> -0.02509255
7   4     B  28  <NA>  op4          NA
8   4     B  NA type4 <NA>  0.10807273
9   5     A  27  <NA>  op5          NA
10  5     A  NA type5 <NA> -0.48543524
11  6     B  26  <NA>  op6          NA
12  6     B  NA type6 <NA> -0.50421713

此数据集的每个观察值有多行,而一些变量存储在一行中,一些变量存储在另一行中。我喜欢以一种整洁的格式使用它,每个 id 只有一行。我可以过滤成两个数据框然后重新加入,但必须有更简单的方法。总结会起作用,但只适用于数字变量。 群固定id,不同群内id不相同

  group_by(id) %>% 
  summarise_if(is.numeric, sum, na.rm=T)
data

看来一定有一个非常简单的解决方案,但我想不出来。感谢您的帮助!

answer by tmfmnk到一个类似的问题,你应该可以通过在最后添加这个代码块来解决这个问题:

dat <- dat %>%
  group_by(id) %>%
  summarize(across(everything(), ~ first(na.omit(.))))
dat

link 中的问题是仅针对数字的特例,但此代码块应该可以正常工作。