【问题标题】:Mutating dataframe in R in only certain cases仅在某些情况下在 R 中更改数据帧
【发布时间】:2021-09-21 15:55:08
【问题描述】:

我在 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) * .))

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

【问题讨论】:

    标签: r dataframe dplyr negative-number


    【解决方案1】:

    取绝对值并乘以 -1 为 L,否则为 sign(.)。

    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...
    

    【讨论】:

    • 非常感谢您的回答!当我尝试这样做时,我收到以下错误消息:错误:mutate() 输入问题..1。 ℹ..1 = across(...)。 x 数学函数的非数字参数
    • 问题中显示的数据除了第一列之外只有数字列,但您可能试图将其应用于也具有非数字列的不同数据框。将其限制为数字列。
    • 您可能想用选择助手替换across() 中的-1 参数。试试:dat %&gt;% mutate(across(where(is.numeric), ~ if_else(grepl("^L", A), -abs(.), .)))。我会编辑答案,但队列已满`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2015-09-15
    • 2014-01-17
    • 2020-06-20
    • 2015-05-02
    相关资源
    最近更新 更多