我试图做一些条件操作,并发现一个奇怪的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在分组数据框中对这些向量奇怪地工作?
答案 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