gpt4 book ai didi

r - 如何使用 dplyr 的 coalesce 函数和 group_by() 为每个人创建一行并填充所有值?

转载 作者:行者123 更新时间:2023-12-05 09:27:24 25 4
gpt4 key购买 nike

我正在尝试使用 coalesce() 为每个参与者生成一行,其中包含他们的姓名和分数。参与者有 3 次填写数据的机会,大多数只填写一次(多次填写的总是相同的数据)。所以我的数据看起来像:

library(dplyr)

test_dataset <- tibble(name = c("justin", "justin", "justin", "corey", "corey", "corey", "sib", "sib", "sib", "kate", "kate", "kate"),
score1 = c(NA_real_, NA_real_, 1, 2, NA_real_, NA_real_, 2, NA_real_, 2, NA_real_, NA_real_ , NA_real_),
score2 = c(NA_real_, 7, NA_real_, 5, NA_real_, NA_real_, 9, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_))

我希望它看起来像:

library(dplyr)

answer <- tibble(name = c("justin", "corey", "sib", "kate"),
score1_true = c(1, 2, 2, NA),
score2_true = c(7, 5, 9, NA))

我已经尝试了以下解决方案,它确实给了我“真实”分数,但它分布在 12 行(每人 3 行)而不是 4 行(每人一个):

library(dplyr)

test_dataset %>%
dplyr::group_by(name) %>%
mutate(across(c(starts_with("score")), .fns = list(true = ~coalesce(.))))

最佳答案

您可以使用fill(),然后arrange() 分数并使用slice_head():

test_dataset %>% 
group_by(name) %>%
fill(score1, score2) %>%
arrange(score1, score2) %>%
slice_head(n=1)

输出:

  name   score1_true score2_true
<chr> <dbl> <dbl>
1 justin 1 7
2 corey 2 5
3 sib 2 9
4 kate NA NA

感谢@M.Viking 的更简洁/改进的版本:

  • fill() 中使用 .direction="up" 选项
test_dataset %>% 
group_by(name) %>%
fill(score1, score2, .direction="up") %>%
slice_head(n=1)

关于r - 如何使用 dplyr 的 coalesce 函数和 group_by() 为每个人创建一行并填充所有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72453849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com