【问题标题】:If statement true then modify several columns如果语句为真,则修改几列
【发布时间】:2020-03-28 04:06:13
【问题描述】:

当某些陈述为真时,我想在 dplyr 管道中执行几个操作。

对于此类数据:

t = tibble(a = 1:3, b = 1:3, c = 1:3, d = 1:3, e = 1:3)

我想以某种方式写如果

a == 2

然后

b = b + 2
c = c + 3
d = d + 4
e = e + 5

基本上,我不想多次重复 if 条件,因为如果它改变了,我需要在几个容易出错的地方更新它。

【问题讨论】:

  • 不幸的是,dplyr still 没有很好的解决方案来解决这个令人难以置信的常见问题。最好的方法似乎是对数据进行子集化,操作子表,然后 bind_rows 将它们重新组合在一起。

标签: r dplyr


【解决方案1】:

我们可以使用

library(dplyr)
library(purrr)
map_dfc(2:5, ~ {n <- .x ;
               t %>%
                  transmute_at(vars(.x), ~  case_when(a == 2 ~  . + n, TRUE ~ .))}) %>%
   bind_cols(select(t, a), .)

如果我们需要不同的值,那么使用map2

map2_dfc(2:5, c(2L, 1000L, 1500L, 2000L), ~ {n <- .x
               val <- .y;
              t %>%
                  transmute_at(vars(.x), ~  case_when(a == 2 ~  . + val, TRUE ~ .))}) %>%
   bind_cols(select(t, a), .)

【讨论】:

  • 谢谢@akrun。这对我原来的问题很有效。您知道当 a == 2 时如何将不同的文本值分配给几列吗?或者在这种情况下 b = b + 2,但 c = c + 1000 等等。
  • 谢谢,它运作良好。我只需要将整数更改为双精度 (c(2L, 1000L, 1500L, 2000L)),因为我遇到了错误。
  • @PeteK 这似乎是一个错误,因为直到 map_dfc 没有问题,我们将列绑定到 df 列而不是行
猜你喜欢
  • 1970-01-01
  • 2022-11-25
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多