使用group_by和ifelse的奇怪的dplyr错误行为

时间:2018-06-08 18:16:03

标签: r dplyr

我试图做一些条件操作,并发现一个奇怪的dplyr错误 - 或者至少它没有像我认为的那样表现。

让我说我有一个小孩

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

现在,对于每个组(x),如果任何值为负值,我想要将其提升,以便之前的负值中的最低值现在是0.我们还要进行一些错误检查确保any()正常运行。

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

现在,对于x = 1,hasneg为TRUE,对于x = 0,.tar.gz为FALSE,这意味着它在向量上正常工作。然而,我的ifelse语句产生了一些奇怪的东西 - 对于x = 1,要么是2 + 5,要么是对于x = 2要么是1。我原以为7,8,0,1,8,9。

这里发生了什么?为什么ifelse在分组数据框中对这些向量奇怪地工作?

1 个答案:

答案 0 :(得分:3)

因为条件any(y < 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