首页 > 解决方案 > 使用 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  )) 
}

但是没有用...所以我在这里寻求您的指导。先感谢您!

标签: rfor-loopdplyr

解决方案


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)

推荐阅读