仅在某些情况下改变 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...
我在 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...