【问题标题】:Modify column value based on another column value根据另一列值修改列值
【发布时间】:2019-06-19 06:27:12
【问题描述】:

这给我带来了麻烦,我正在使用 dplyr,我想根据 CP 的值更改每周(W1 到 W3)的值:if

      CP             W1              W2              W3             W4
   <dbl>           <dbl>           <dbl>          <dbl>           <dbl>
 1    50               0              60              0               0
 4    10               0               0              0               0
 5    50              20              20             21              50
 6    10               5               0              0              21
 8    10               0              31              0               0

所需的输出应如下所示:

     CP             W1              W2              W3             W4 
    <dbl>           <dbl>           <dbl>          <dbl>           <dbl>
1    50               0              60              0               0
4    10               0               0              0               0
5    50               0               0              0              50
6    10               0               0              0              21
8    10               0              31              0               0

您对如何使用 dplyr 或其他方法处理此问题有任何想法吗? 谢谢!

【问题讨论】:

  • 使用mutateif_elsecase_when(我认为)。您也可以先将其重塑为长形。

标签: r dplyr apply tidyverse


【解决方案1】:

你可以去mutate_at:

library(dplyr)

df %>%
  mutate_at(vars(starts_with("W")), funs(ifelse(. < CP, 0, .)))

输出:

  CP W1 W2 W3 W4
1 50  0 60  0  0
2 10  0  0  0  0
3 50  0  0  0 50
4 10  0  0  0 21
5 10  0 31  0  0

请注意,starts_with 将匹配任何以 W 开头的列名。

如果这是一个问题(例如,如果您不想考虑具有该模式的其他列),您还可以将matches 与只考虑那些后面的W 的正则表达式一起使用按数字:

df %>%
  mutate_at(vars(matches("^W[0-9]+")), funs(ifelse(. < CP, 0, .)))

【讨论】:

  • 如果您以 integer 开头,这将在上面的示例中引发错误 - 在这种情况下,我会坚持使用 ifelse。就个人而言,我在非常特定的用例中(例如处理日期时)使用if_else,并且由于在我有 2 个以上条件时的可读性,我大多使用case_when
  • 抱歉在我看到你的回复之前删除了我的评论。
猜你喜欢
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
相关资源
最近更新 更多