【问题标题】:Replace missing values with the values from multiple columns in R用 R 中多列的值替换缺失值
【发布时间】:2023-01-13 18:25:09
【问题描述】:

例如,我的数据集中有 4 个变量

treatment_alone = c("Yes", "No", "Yes", "No", "No", "No", "No", "No")
treatment_and_fertilizer = c("No", "Yes", "No", "Yes", "No", "No", "No", "No")
treatment_and_manure = c("No", "No", "No", "No", "Yes", "No", "Yes", "No")
treatment_and_composte = c("No", "No", "No", "No", "No", "Yes", "No", "Yes")

data_test = data.frame(treatment_alone, treatment_and_fertilizer, treatment_and_manure,
                       treatment_and_composte)

我想创建一个新列,其中所有这些变量都在一列中作为分类变量,方法是将它们的“否”值替换为其他列的“是”值:例如,

treatment (treatment_alone, treatment_and_fertilizer, treatment_and_manure, treatment_and_compost)

我尝试了以下代码使其工作

df = data_test %>%
treatment_alone = ifelse(treatment_alone == "Yes","treatment alone",""),
    treatment_and_fertilizer = ifelse(treatment_and_fertilizer == "Yes","treatment and fertilizer",""),
    treatment_and_manure = ifelse(treatment_and_manure == "Yes","treatment and manure",""),
    treatment_and_compost = ifelse(treatment_and_compost == "Yes","treatment and compost","")

df = data_test %>%
  mutate(treatment = coalesce(treatment_alone,treatment_and_fertilizer, treatment_and_manure, treatment_and_compost))

但它没有用。我还尝试按如下方式替换两列中的值

df = data_test %>%
  mutate(treatment = coalesce(treatment_alone,treatment_and_fertilizer))

也没有用。有谁知道如何通过用“是”替换“否”值来创建这样的列?

【问题讨论】:

  • 您能否编辑您的问题以提供可重现的示例数据?

标签: r tidyverse


【解决方案1】:

我们可能不需要创建新列——如果列名都以treatment开头,则循环across这些列,在将_替换为空格后,将"Yes"替换为列名(cur_column()) (str_replace_all)和invokecoalesce输出的列列表(注意当我们在case_when中没有指定TRUE条件时,默认返回NA

library(dplyr)
library(purrr)
library(stringr)
data %>%
   mutate(treatment = invoke(coalesce, across(starts_with("treatment"), 
     ~ case_when(.x == "Yes"~ str_replace_all(cur_column(), "_", " ")))))

OP 代码中的问题似乎是将ifelse 中的no 案例分配给""coalesce 将选择每行中的第一个非 NA,因此如果它为空,则不会有任何影响

【讨论】:

  • 感谢你的回复。我试过这段代码,但它确实起作用了,但它不起作用,它创建了一个 biochar 变量,其值仅为 NA
猜你喜欢
  • 2021-10-11
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多