gpt4 book ai didi

R dplyr 条件变异与 group_by

转载 作者:行者123 更新时间:2023-12-04 08:40:05 25 4
gpt4 key购买 nike

我有一个分组的 data.frame,我想改变一个列,有条件地检查特定列的 all()

在这个例子中,我有一个包含 3 列的简单 data.frame;我按 code 列分组,如果该组的 B 列完全是 NA,我想从 列复制值code>A,否则保留 B 的原始非 NA 值。

输入:

> example <- tibble::tribble(
~code, ~A, ~B,
"1", 0.5, 0.7,
"1", 0.5, 0.3,
"1", 0.5, 0.25,
"2", 0.2, NA,
"2", 0.8, NA,
"2", 0.5, NA
)
> example %>% dplyr::group_by(code)
# A tibble: 6 x 3
# Groups: code [2]
code A B
<chr> <dbl> <dbl>
1 1 0.5 0.7
2 1 0.5 0.3
3 1 0.5 0.25
4 2 0.2 NA
5 2 0.8 NA
6 2 0.5 NA

期望的输出:

# A tibble: 6 x 3
code A B
<chr> <dbl> <dbl>
1 1 0.5 0.7
2 1 0.5 0.3
3 1 0.5 0.25
4 2 0.2 0.2
5 2 0.8 0.8
6 2 0.5 0.5

我试过使用 ifelse() 并且它可以检查 all(is.na(B)) 但它没有将 rowwise 归为标准行为并且只需从第一个值复制。

example %>% 
dplyr::group_by(code) %>%
dplyr::mutate(
B = ifelse(all(is.na(B)), A, B)
)
# A tibble: 6 x 3
# Groups: code [2]
code A B
<chr> <dbl> <dbl>
1 1 0.5 0.7
2 1 0.5 0.7
3 1 0.5 0.7
4 2 0.2 0.2
5 2 0.8 0.2
6 2 0.5 0.2

赋予固定值是可以的。

example %>% 
dplyr::group_by(code) %>%
dplyr::mutate(
isBna = ifelse(all(is.na(B)), 'y', 'n')
)
# A tibble: 6 x 4
# Groups: code [2]
code A B isBna
<chr> <dbl> <dbl> <chr>
1 1 0.5 0.7 n
2 1 0.5 0.3 n
3 1 0.5 0.25 n
4 2 0.2 NA y
5 2 0.8 NA y
6 2 0.5 NA y

对于 dplyr::if_else(),它会抛出一个错误,提示 AB 不是固定值。

example %>% 
dplyr::group_by(code) %>%
dplyr::mutate(
B = if_else(all(is.na(B)), A, B)
)
Error: Problem with `mutate()` input `B`.
x `true` must be length 1 (length of `condition`), not 3.
ℹ Input `B` is `if_else(all(is.na(B)), A, B)`.
ℹ The error occurred in group 1: code = "1".
Run `rlang::last_error()` to see where the error occurred.

和我的真实案例错误有点不同。

# sometime like this
Error: Problem with `mutate()` input `xx`.
x `false` must be a logical vector, not a double vector.

# and sometimes like this
Error: Problem with `mutate()` input `xx`.
x `false` must be length 1 (length of `condition`), not 12.

有什么方法可以在管道%>%链中实现我的目标吗?
提前致谢。

最佳答案

使用 if/else 而不是 ifelse 因为 all 返回长度为 1 和 ifelse 的输出 将返回与输入长度相同的输出,因此它会在整个组中循环使用第一个元素。

library(dplyr)

example %>%
group_by(code) %>%
mutate(B = if(all(is.na(B))) A else B))

# code A B
# <chr> <dbl> <dbl>
#1 1 0.5 0.7
#2 1 0.5 0.3
#3 1 0.5 0.25
#4 2 0.2 0.2
#5 2 0.8 0.8
#6 2 0.5 0.5

关于R dplyr 条件变异与 group_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64617859/

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