将数据框行与文本、数字和 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
),我想保留第一个。最后,对于在数字列(age
、grade
和 score
)中都有值的行,我想要新的值是合并行的平均值。
如果遵循所有这些规则,数据框应该看起来像这样。
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
我有一个类似下面的数据框(虽然大得多)。
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
),我想保留第一个。最后,对于在数字列(age
、grade
和 score
)中都有值的行,我想要新的值是合并行的平均值。
如果遵循所有这些规则,数据框应该看起来像这样。
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