r - 使用 mutate 比较两个数据帧的 For 循环
问题描述
我有两个具有相同变量名称的数据框,第一个带有值,第二个带有阴影变量。我想根据 df2 中的值对 df1 上的变量进行变异(如果 df2$x > 90,那么我想将 df1$x 变异为 NA)。
# Example input dataframes
df1 <- data.frame(
x = c(123, 456, 789),
y = c(120, 745, 789),
z = c(852, 741, 963)
)
df2 <- data.frame(
x = c(1, 95, 96),
y = c(1, 99, 1),
z = c(98, 1, 1)
)
我想要获得的是一个看起来像这样的数据框:
# x y z
#1 123 120 NA
#2 NA NA 741
#3 NA 789 963
我得到了我想要的结果:
result <- df1%>%
mutate(x= replace(x, df2$x > 90 , NA )) %>%
mutate(y= replace(y, df2$y > 90 , NA )) %>%
mutate(z= replace(z, df2$z > 90 , NA ))
但我想改用 for 循环,因为我有几个变量。我试过:
for (i in c("x" , "y" , "z") {
result <- df1%>%
mutate(i= replace(i, df2$i > 90 , NA ))
}
但是没有用...所以我在这里寻求您的指导。先感谢您!
解决方案
1) 跨这适用于处理所有列:
library(dplyr)
df1 %>%
mutate(across(.fn = ~ replace(., df2[[cur_column()]] > 90, NA)))
## x y z
## 1 123 120 NA
## 2 NA NA 741
## 3 NA 789 963
环形
2) 循环关于问题中的循环,可以使用 mutate(across(...)) 。我们首先制作 df1 的副本以保留输入。结果在 df1_na 中。
library(dplyr)
df1_na <- df1
for(nm in names(df1)) {
df1_na <- df1_na %>% mutate(across(all_of(nm), ~ replace(., df2[[nm]] > 90, NA)))
}
3)rlang或使用rlang:
library(dplyr)
df1_na <- df1
for(nm in names(df1)) {
df1_na <- df1_na %>% mutate({{nm}} := replace(.[[nm]], df2[[nm]] > 90, NA))
}
4)基础或只有基础的循环(尽管在另一个答案中提供了更简单的基础解决方案)。
df1_na <- df1
for(nm in names(df1)) df1_na[[nm]] <- replace(df1_na[[nm]], df2[[nm]] > 90, NA)
推荐阅读
- solr - Solr 带空格的模糊搜索
- android - 如何将 Android 手机连接到 Visual Studio Code?
- typo3 - 使用命令控制器添加的 MM 关系未显示在后端字段中
- angular - 在清晰度设计角度的第二步中设置步进器
- python - Linux:为什么从 Python3(或其他解释器)启动 /bin/bash 作为子进程会使父进程对 SIGINT(ctrl-c)免疫?
- nginx - request.client.host 在一台服务器上工作,但不在另一台服务器上工作?
- python - 如何在 set_cookie 函数 django 中添加 samesite=None?
- javascript - Javascript表单验证按钮:表单有效后进入下一页
- sql-server - 如何对以下查询仅使用一个存在子句而不是多个存在子句
- r - 由连字符组成的数字序列,而不用连字符出现的单个事件