我正在尝试使用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行(每人1行):
library(dplyr)
test_dataset %>%
dplyr::group_by(name) %>%
mutate(across(c(starts_with("score")), .fns = list(true = ~coalesce(.))))发布于 2022-05-31 20:40:08
我们可以根据NA元素重新排序这些值,然后将第一行切片
library(dplyr)
test_dataset %>%
group_by(name) %>%
dplyr::mutate(across(starts_with('score'),
~ .x[order(is.na(.x))])) %>%
slice_head(n = 1) %>%
ungroup-output
# A tibble: 4 × 3
name score1 score2
<chr> <dbl> <dbl>
1 corey 2 5
2 justin 1 7
3 kate NA NA
4 sib 2 9或者另一种选择是在重新安排之后使用complete.cases
test_dataset %>%
group_by(name) %>%
dplyr::mutate(across(starts_with('score'),
~ .x[order(is.na(.x))])) %>%
filter(complete.cases(across(starts_with('score')))|row_number() == 1) %>%
ungroup-output
# A tibble: 4 × 3
name score1 score2
<chr> <dbl> <dbl>
1 justin 1 7
2 corey 2 5
3 sib 2 9
4 kate NA NA发布于 2022-05-31 20:45:34
您可以使用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)https://stackoverflow.com/questions/72453849
复制相似问题