if_else() 函数与 group_by、all() 和 is.na() 在 R 中的结合使用
Use of if_else() function in conjunction with group_by, all() and is.na() in R
我在论坛中搜索了与我类似的问题,但找不到与该问题完全匹配的内容。
我有一个 R 数据框,其中包含一个分组列和包含值的列,例如双精度和日期。我想要做的是编写一个函数来对数据框进行分组并创建一个新列(1)如果值列仅包含 na,returns na 或(2)如果值列至少包含一个非 na,return,比如说,最大值。我尝试了以下操作:
library(dplyr)
a <- c("A", "A", "B", "B", "C", "C")
b <- c(1,2,NA,NA,NA,6)
c <- as.Date(c("2021-01-01", "2021-01-02", NA,
NA, NA, "2021-01-06"))
df <- data.frame("Group" = a, "Value" = b, "Date" = c)
take_max <- function(data, group, value, new_col_name, fun) {
data %>% group_by({{ group }}) %>%
mutate({{ new_col_name }} := if_else(
all(is.na({{ value }})),
fun(NA),
max({{ value }}, na.rm = TRUE)
))
}
df %>% take_max(Group, Date, min_max, fun = as.Date)
df %>% take_max(Group, Value, min_max, fun = as.numeric)
它似乎有效,但我收到以下警告
Warnmeldungen:
1: Problem with `mutate()` input `new_col`.
i kein nicht-fehlendes Argument für max; gebe -Inf zurück
i Input `new_col` is `if_else(all(is.na(Value)), fun(NA), max(Value, na.rm = TRUE))`.
i The error occurred in group 2: Group = "B".
2: In max(~Value, na.rm = TRUE) :
kein nicht-fehlendes Argument für max; gebe -Inf zurück
我对这个问题的理解是,在 B 组 if_else
测试中,如果 max({{ value }}, na.rm = TRUE)
(在本例中等同于 max(c())
),也与fun(NA)
因此评估两个选项。我尝试将 if_else
替换为 ifelse
,但 Date 类型未保留。
有人知道如何处理吗?
试试这个:
take_max <- function(data, group, value, new_col_name){
data %>%
group_by({{group}}) %>%
mutate({{new_col_name}} := if(all(is.na({{value}}))) NA else max({{value}}, na.rm = TRUE))
}
take_max(df, Group, Value, min_max)
take_max(df, Group, Date, min_max)
如果您不希望每个组有多个记录,您可以将 mutate
替换为 summarise
。
我在论坛中搜索了与我类似的问题,但找不到与该问题完全匹配的内容。
我有一个 R 数据框,其中包含一个分组列和包含值的列,例如双精度和日期。我想要做的是编写一个函数来对数据框进行分组并创建一个新列(1)如果值列仅包含 na,returns na 或(2)如果值列至少包含一个非 na,return,比如说,最大值。我尝试了以下操作:
library(dplyr)
a <- c("A", "A", "B", "B", "C", "C")
b <- c(1,2,NA,NA,NA,6)
c <- as.Date(c("2021-01-01", "2021-01-02", NA,
NA, NA, "2021-01-06"))
df <- data.frame("Group" = a, "Value" = b, "Date" = c)
take_max <- function(data, group, value, new_col_name, fun) {
data %>% group_by({{ group }}) %>%
mutate({{ new_col_name }} := if_else(
all(is.na({{ value }})),
fun(NA),
max({{ value }}, na.rm = TRUE)
))
}
df %>% take_max(Group, Date, min_max, fun = as.Date)
df %>% take_max(Group, Value, min_max, fun = as.numeric)
它似乎有效,但我收到以下警告
Warnmeldungen:
1: Problem with `mutate()` input `new_col`.
i kein nicht-fehlendes Argument für max; gebe -Inf zurück
i Input `new_col` is `if_else(all(is.na(Value)), fun(NA), max(Value, na.rm = TRUE))`.
i The error occurred in group 2: Group = "B".
2: In max(~Value, na.rm = TRUE) :
kein nicht-fehlendes Argument für max; gebe -Inf zurück
我对这个问题的理解是,在 B 组 if_else
测试中,如果 max({{ value }}, na.rm = TRUE)
(在本例中等同于 max(c())
),也与fun(NA)
因此评估两个选项。我尝试将 if_else
替换为 ifelse
,但 Date 类型未保留。
有人知道如何处理吗?
试试这个:
take_max <- function(data, group, value, new_col_name){
data %>%
group_by({{group}}) %>%
mutate({{new_col_name}} := if(all(is.na({{value}}))) NA else max({{value}}, na.rm = TRUE))
}
take_max(df, Group, Value, min_max)
take_max(df, Group, Date, min_max)
如果您不希望每个组有多个记录,您可以将 mutate
替换为 summarise
。