【问题标题】:Replacing NA values in data frame iteratively using another column使用另一列迭代替换数据框中的 NA 值
【发布时间】:2022-01-03 01:36:26
【问题描述】:

我有一个包含大约 50 个重叠列的数据框,我需要将它们组合起来。下面是数据框的外观(大约 150 行长,数百列)

ID   PAI_Q1.y  PAI_Q1.x
540     0      NA
680     1      NA
240     NA      2
330     NA      3

对于单列,以下代码完美运行:

qualtrics <- qualtrics %>% 
   mutate(PAI_Q1 = ifelse(is.na(PAI_Q1.y), PAI_Q1.x, PAI_Q1.y))

但是,我在将其写入需要转换的所有行(即 PAI_Q2、PAI_Q3 等)的循环或函数中时遇到了问题。以下是我迄今为止所做的两次尝试。有没有人对让我迭代地完成这个基本任务的调整(或知道存在的函数)有什么建议?

尝试 #1

mutate_col <- function(data, string, string.x, string.y){
  data <- data %>% mutate(string = ifelse(is.na(string.y), string.x, string.y))
}
Error: Problem with `mutate()` column `string`.

string = ifelse(is.na(string.y), string.x, string.y)。 未找到 x 对象“PAI_Q1.y”

尝试 #2

for (i in 1:colnames(df)){
  if(names(i) %in% list_of_cols){ #list of columns that must be combined
    y <- paste(i, ".y", sep = "")
    x <-  paste(i, ".x", sep = "")
  df <- df %>% mutate(i = ifelse(is.na(y), x, y))
  }
  
}

ID   PAI_Q1.y  PAI_Q1.x    i.1
540     0      NA          PAI.Q1.y
680     1      NA          PAI.Q1.y
240     NA      2          PAI.Q1.y
330     NA      3          PAI.Q1.y

【问题讨论】:

  • dplyr::coallesce() 会一次性给你想要的吗?
  • 看起来您将“ID”上的两个表连接在一起,然后这些列被命名为 *.x*.y。是否有任何理由不堆叠表格,过滤掉 NA 值,然后按 ID 排序?那个或接近的东西可能更容易。

标签: r tidyverse tidy


【解决方案1】:

您可以使用tidyr 将数据从宽格式更改为长格式,然后获取正确格式的数据,然后再更改回宽格式。

library(stringr)
library(tidyr)
library(dplyr)

qualtrics <- qualtrics %>%
  tidyr::pivot_longer(
    !ID,
    names_to = "question",
    values_to = "value",
    values_drop_na = TRUE
  ) %>%
  dplyr::mutate(question = stringr::str_extract(question, "[^.]+")) %>%
  tidyr::pivot_wider(names_from = question, values_from = value)

输出

# A tibble: 4 × 3
     ID PAI_Q1 PAI_Q2
  <dbl>  <dbl>  <dbl>
1   540      0      0
2   680      1      1
3   240      2      2
4   330      3      3

数据

qualtrics <-
  structure(
    list(
      ID = c(540, 680, 240, 330),
      PAI_Q1.y = c(0, 1,
                   NA, NA),
      PAI_Q1.x = c(NA, NA, 2, 3),
      PAI_Q2.y = c(0, 1, NA, NA),
      PAI_Q2.x = c(NA, NA, 2, 3)
    ),
    class = "data.frame",
    row.names = c(NA,-4L)
  )

【讨论】:

  • 你可以保存几行:pivot_longer(!ID, names_to = c("question", "suffix"), values_to = "value", names_sep = "[.]", values_drop_na = TRUE) 或类似的东西。不确定是否有办法让它更短并删除“后缀”列
猜你喜欢
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2016-03-08
  • 2015-02-17
  • 2019-04-03
  • 2022-07-15
相关资源
最近更新 更多