将数据框行与文本、数字和 NA 值合并

Merging dataframe rows with text, numeric, and NA values

我有一个类似下面的数据框(虽然大得多)。

name age sex favcolor grade score
tim NA NA blue 12 100
tim 18 male red 12 50
dave 17 male red 12 85
mike 15 male green 10 95
john 12 male NA 7 80
john 12 NA orange 7 90

有几件事我想做。我的主要目标是通过 name 变量合并行,这样每个名字都有一行。其次,合并行时,我希望包含数据的单元格覆盖 NA 的单元格(tim with age and sex。第三,如果合并的行都具有文本值(例如 tim with favcolor),我想保留第一个。最后,对于在数字列(agegradescore)中都有值的行,我想要新的值是合并行的平均值。

如果遵循所有这些规则,数据框应该看起来像这样。

name age sex favcolor grade score
tim 18 male blue 12 75
dave 17 male red 12 85
mike 15 male green 10 95
john 12 male orange 7 85

有没有一种简单的方法可以做到这一点?我已经尝试了大约 30 种不同的东西,但结果从来没有像我想要的那样。任何帮助将不胜感激。

您可以 group_by(name) 并使用 summarize 将行折叠成一个行。

最后,relocate 将列重新排序作为输入。

library(dplyr)

df %>% 
  group_by(name) %>% 
  summarize(across(where(is.numeric), ~ mean(.x, na.rm = T)),
            across(where(is.character), ~.x[!is.na(.x)][1])) %>% 
  relocate(colnames(df))

# A tibble: 4 × 6
  name    age sex   favcolor grade score
  <chr> <dbl> <chr> <chr>    <dbl> <dbl>
1 dave     17 male  red         12    85
2 john     12 male  orange       7    85
3 mike     15 male  green       10    95
4 tim      18 male  blue        12    75