仅在某些情况下改变 R 中的数据框

Mutating dataframe in R in only certain cases

我在 R 中有一个数据框,其中包含多个列,我想根据特定列的值对其进行操作。这是以相同方式设置的示例数据框:

dat <- data.frame(A=c("L","Right","R","Left"), B=c(2,5,7,-8), C=c(-3,6,-4,9))
dat

如果 A 列中的值是“L”或“Left”,我想将该行中的其他列转换为负值除非该值已经是负值 .例如,在第一行中,我希望 2 变为负数 2,但保持 -3 不变。在第四行,我希望 -8 保持不变,但想将 9 更改为 -9。

我以前使用此代码转换为负值,但这是我最初只使用正值并且不想保留某些值不变的时候。

library(dplyr)
dat <- dat %>% mutate(across(where(is.numeric), ~ if_else(grepl("^L", A), -1, 1) * .))

我不确定如何更改上面的代码来解决这个新问题,如果有人能帮助回答这个问题,我将不胜感激。非常感谢!

L取绝对值乘以-1,否则乘以符号(.)。

dat %>% 
  mutate(across(-1, ~ if_else(grepl("^L", A), -1, sign(.)) * abs(.)))

给予:

      A  B  C
1     L -2 -3
2 Right  5  6
3     R  7 -4
4  Left -8 -9

dat %>% 
  mutate(across(-1, ~ if_else(grepl("^L", A), -abs(.), .)))

请注意,用新值覆盖 dat 会使调试变得更加困难,因为这样可能会混淆 dat 的版本 当前版本,如果您尝试仅重新运行上面的行,您将从第二个版本而不是第一个版本开始。建议使用

dat2 <- dat %>% ...whatever...