r - 如何应用 `mutate_at` 内的函数,该函数按行条件影响其他列中的值?

标签 r dplyr rowwise

我有一个数据框,我想在其中转换一组列的值,条件是同一行中另一组列的值。我正在尝试但未能在 tidyverse 中做到这一点与 rowwise 的组合和mutate_at 。这是一个可重现的示例。

library(dplyr)

set.seed(20912)
dat <- data.frame(cat1 = sample(LETTERS[1:2], 10, replace = TRUE), cat2 = sample(LETTERS[1:2], 10, replace = TRUE), id = 3, sim_1 = rnorm(10), sim_2 = rnorm(10), stringsAsFactors = FALSE)

> dat
   cat1 cat2 id      sim_1       sim_2
1     A    A  3 -0.1054062 -0.47563580
2     B    A  3 -1.7198921  0.76713640
3     A    B  3 -0.5946627 -0.33958464
4     B    B  3 -1.6547488 -0.13026564
5     B    B  3 -0.3779149  1.29590315
6     B    B  3  0.6271939  0.08707965
7     B    B  3  1.6376711  1.02151753
8     A    B  3  1.7675520  1.66983954
9     B    A  3 -0.3284081 -1.28175621
10    B    B  3  0.8431148 -0.15415091

在该表中,我想转换以 "sim_" 开头的所有列的值,以 cat1 的值为条件和cat2 。举例来说,我想替换所有 "sim_*" 中的值列 NA ,但仅限于 cat1 == cat2 的行。所以我的预期结果是:

   cat1 cat2 id      sim_1      sim_2
1     A    A  3         NA         NA
2     B    A  3 -1.7198921  0.7671364
3     A    B  3 -0.5946627 -0.3395846
4     B    B  3         NA         NA
5     B    B  3         NA         NA
6     B    B  3         NA         NA
7     B    B  3         NA         NA
8     A    B  3  1.7675520  1.6698395
9     B    A  3 -0.3284081 -1.2817562
10    B    B  3         NA         NA

我尝试了 rowwise 主题的一些变体加mutate_at没有运气。例如:

> dat %>% rowwise() %>% mutate_at(vars(starts_with("sim_")), function(x) { ifelse(cat1 == cat2, NA, x) })
Error in ifelse(cat1 == cat2, x, 0) : object 'cat1' not found

我错过了什么?我意识到,如果我首先将数据从宽到长 reshape ,这会更容易,但我希望了解有关 tidyverse 的知识。函数或语法,并找到一种无需重新调整数据即可实现此目的的方法。

最佳答案

我们可以使用replaceifelse/replace进行向量化,这样可以避免rowwise

library(dplyr)
dat %>%
   mutate_at(vars(starts_with('sim')), ~ replace(., cat1 == cat2, NA_real_))

或者因为这些是数字列,可以直接进行转换

dat %>% 
   mutate_at(vars(starts_with('sim')),  ~.* NA^(cat1 == cat2))

关于r - 如何应用 `mutate_at` 内的函数,该函数按行条件影响其他列中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102255/

相关文章:

r - 使用逗号格式化所有数字列以分隔 v

r - 查找具有多个交点的两个图之间的公共(public)区域

r - 计算每个类别的缺失值

r - 找到向量中的最小值但没有 0

r - 如何在组内将第一个值与每个后续值进行比较,直到满足条件

从受密码保护的站点读取信息

r - 子集 data.table 列用于计算新值,但保留所有旧列 + 新值

读入 CSV 文件并添加带有文件名的列

r - 将匹配 NA 的 df 的字符行与所有内容进行比较,并根据比较创建新列或 df

一个命令中的行明智正态性、偏度和峰度