我正在尝试比较两个不同大小的数据帧,并使用 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),但我不知道如何解决它。
如果有人可以提供帮助,我将非常感激!
一个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)