簡體   English   中英

在 R 中結合使用 if_else() function 和 group_by、all() 和 is.na()

[英]Use of if_else() function in conjunction with group_by, all() and is.na() in R

我在論壇中搜索了與我的問題類似的問題,但找不到與該問題完全匹配的問題。

我有一個 R dataframe 有一個分組列和包含值的列,例如雙精度和日期。 我想要做的是編寫一個 function 對 dataframe 進行分組並創建一個新列(1)如果值列僅包含 na,則返回 na 或(2)如果值列包含至少一個非 na,則返回,比如說最大值。 我嘗試了以下方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM