使用 tidyverse 动态插入缺失

问题描述 投票:0回答:1

我正在使用几个函数,这将在我的数据整理工作流程中节省大量时间。 我正在尝试向 r 提供列列表。 我想循环遍历这些列来查找特定值。 当遇到这些值时,我想用 NA 替换它们,而不是保留这些值。 我的问题是有时我的数据中会有一些因素。 当我将它们强制返回数字形式时,这些函数没有获取感兴趣的值。 有什么方法可以解决这个问题吗? 这是我的代码以及从该代码获得的输出:

convert_factors_to_numeric <- function(df, columns) {
  df %>%
    mutate(across(all_of(columns), ~ if (is.factor(.x)) as.numeric(as.character(.x)) else .x))
}

handle_missing_values <- function(df, columns, missing_codes = c(-7, -5, -8, -9, 99)) {
  df %>%
    mutate(across(all_of(columns), ~ {
      # Loop through each missing code and apply na_if
      temp <- .x
      for (code in missing_codes) {
        temp <- na_if(temp, code)
      }
      temp
    }))
}

library(dplyr)

# Sample reproducible data
set.seed(123)
df <- tibble(
  age = c(15, 16, 17, 15, -9),  # Added missing code (-9) to age
  qn = factor(sample(c(1, 2, 3, -7, -9), 5, replace = TRUE)),  # qntransgender as factor
  q1 = factor(sample(1:2, 5, replace = TRUE)),  # q1 as a factor
  q2 = sample(1:5, 5, replace = TRUE),
  q3 = sample(1:4, 5, replace = TRUE)
)

# Step 1: Convert factors to numeric
df_converted <- convert_factors_to_numeric(df, c("qn", "q1", "age"))
is.numeric(df_converted$q1)

# Step 2: Handle custom missing values (-7, -9, etc.)
df_final <- handle_missing_values(df_converted, c("qn", "q1", "age"))

print(df_final)

A tibble: 5 × 5
    age    qn    q1    q2    q3
  <dbl> <dbl> <dbl> <int> <int>
1    15     3     1     2     1
2    16     3     2     3     4
3    17     2     2     5     1
4    15     2     2     3     1
5    NA     3     1     3     1

如您所见,qn 在第 4 行和第 5 行中应该有两个 NA,如下所示:

A tibble: 5 × 5
    age    qn    q1    q2    q3
  <dbl> <dbl> <dbl> <int> <int>
1    15     3     1     2     1
2    16     3     2     3     4
3    17     2     2     5     1
4    15     NA     2     3     1
5    NA     NA    1     3     1

我错过了什么?如何修复我的代码以获得此输出?

r loops dplyr replace tidyverse
1个回答
0
投票

更简单:

handle_missing_values <- function(df, columns, missing_codes = c(-7, -5, -8, -9, 99)) {
  df |> mutate(across(all_of(columns), ~na_if(.x, missing_codes)))
}
© www.soinside.com 2019 - 2024. All rights reserved.