【问题标题】:Odd dplyr misbehavior using group_by and ifelse使用 group_by 和 ifelse 的奇怪 dplyr 不当行为
【发布时间】:2018-11-18 20:26:28
【问题描述】:

我正在尝试进行一些条件操作,并发现一个奇怪的 dplyr 错误 - 或者至少它的行为不像我认为的那样。

假设我有一个 tibble

a <- tribble( ~x, ~y, 1, 2, 1, 3, 1, -5, 2, 1, 2, 8, 2, 9 )

现在,对于每个组 (x),如果其中任何一个值为负数,我想将其提高,这样以前的负值中的最小值现在为 0。让我们也进行一些错误检查以确保 @987654322 @ 工作正常。

a %>% group_by(x) %>% mutate(hasneg = any(y<0), y_star = ifelse(any(y<0), y+abs(min(y, na.rm=T)), y))

这会产生

# A tibble: 6 x 4
# Groups:   x [2]
      x     y hasneg y_star
  <dbl> <dbl> <lgl>   <dbl>
1     1     2 TRUE        7
2     1     3 TRUE        7
3     1    -5 TRUE        7
4     2     1 FALSE       1
5     2     8 FALSE       1
6     2     9 FALSE       1

现在,hasneg 对于 x=1 为 TRUE,对于 x=0 为 FALSE,这意味着它在向量上正常工作。然而,我的 ifelse 语句产生了一些奇怪的东西——要么 2+5 表示 x=1,要么 1 表示 x=2。我本来预计是 7,8,0,1,8,9。

这里发生了什么?为什么 ifelse 在分组数据框中处理这些向量时会出现奇怪的现象?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    因为条件any(y &lt; 0)(每组为1)的长度与传递给ifelse的值的长度不同,所以只拾取第一个值。你需要if/else:

    a %>%
        group_by(x) %>%
        mutate(hasneg = any(y < 0),
               y_star = if(any(y < 0)) y+abs(min(y, na.rm=T)) else y)
    # A tibble: 6 x 4
    # Groups:   x [2]
    #      x     y hasneg y_star
    #  <dbl> <dbl> <lgl>   <dbl>
    #1     1     2 TRUE        7
    #2     1     3 TRUE        8
    #3     1    -5 TRUE        0
    #4     2     1 FALSE       1
    #5     2     8 FALSE       8
    #6     2     9 FALSE       9
    

    【讨论】:

    • 或者使用 rep() 重复任何输出 - 这有效!并且是一个更简单的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2015-05-27
    • 2018-02-09
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多