如何比较两个数据帧并使用 mutate across 添加新列?

Kat*_*ang 6 r dataframe dplyr

我正在尝试比较两个不同大小的数据帧,并使用 mutate across 添加新列。

这是我的数据框。

df <- data.frame(No = c(1,2,3,4),
                 s_Ca = c(NA, 250, NA, 500),
                 s_P = c(300, NA, NA, NA),
                 s_Fe = c(NA, 10, NA, NA),
                 s_K = c(NA, NA, NA, 300))
Run Code Online (Sandbox Code Playgroud)

我想将它与下面的数据框进行比较。

intake <- data.frame(cutoff = c(210, 210, 3.6, 1050),
                     nut = c("Ca", "P", "Fe", "K"))
Run Code Online (Sandbox Code Playgroud)

Ca如果in的值df大于Cain的截止值intake,那么我将向新列添加 1 s_Ca_cat,否则添加 0。

P如果in的值df大于Pin的截止值intake,我将在新列中添加 2 s_P_cat,依此类推。

也就是说,我想要的结果是这样的

df_cat <- data.frame(No = c(1,2,3,4),
                     s_Ca_cat = c(0, 1, 0 , 1),
                     s_P_cat = c(2, 0, 0, 0),
                     s_Fe_cat = c(0, 3, 0, 0),
                     s_K_cat = c(0, 0, 0, 0))
Run Code Online (Sandbox Code Playgroud)

这就是我一开始尝试做的。

df2 <- df %>% 
  mutate(across(!contains("No"),
                ~ ifelse(. >= intake_rep, 1, NA),
                .names = "{.col}_cat"))
Run Code Online (Sandbox Code Playgroud)

我正在尝试更简单的版本,它将相同的值 1 添加到新列,我什至坚持使用这个更简单的版本。它一直返回的不是一列,而是包含 2 个属性的列表?(抱歉我是R新手)

我猜测的原因是~ ifelse中的声明mutate(across),但我不知道如何解决它。

  1. 如何修复我尝试过的代码?
  2. 您能帮助我如何向每个新列添加不同的值吗?

如果有人可以提供帮助,我将非常感激!

Dar*_*sai 3

一个dplyr办法:

library(dplyr)

df %>%
  mutate(across(-No, .names = "{.col}_cat",
                ~ ifelse(.x > intake$cutoff[paste0("s_", intake$nut) == cur_column()] & !is.na(.x),
                         match(cur_column(), names(pick(-No))), 0)))

#   No s_Ca s_P s_Fe s_K s_Ca_cat s_P_cat s_Fe_cat s_K_cat
# 1  1   NA 300   NA  NA        0       2        0       0
# 2  2  250  NA   10  NA        1       0        3       0
# 3  3   NA  NA   NA  NA        0       0        0       0
# 4  4  500  NA   NA 300        1       0        0       0
Run Code Online (Sandbox Code Playgroud)