【问题标题】:dplyr error: strange issue when combining group_by, mutate and ifelse. Is it a bug?dplyr 错误:组合 group_by、mutate 和 ifelse 时出现奇怪的问题。它是一个错误吗?
【发布时间】:2015-05-27 07:07:55
【问题描述】:

我在使用 dplyr 以及 group_by、mutate 和 ifelse 的组合时遇到了奇怪的问题。考虑以下data.frame

> df1
  crawl.id group.id hits.diff
1        1        1        NA
2        1        2        NA
3        2        2         0
4        1        3        NA
5        1        3        NA
6        1        3        NA

当我使用下面的代码时

library(dplyr)
df1 %>%
  group_by(group.id) %>% 
  mutate( hits.consumed = ifelse(hits.diff<=0,-hits.diff,0) )

由于某种原因我得到了

Error: incompatible types, expecting a logical vector**

但是,删除 group_by()ifelse 一切正常:

df1 %>%
  mutate( hits.consumed = ifelse(hits.diff<=0,-hits.diff,0) )

crawl.id group.id hits.diff hits.consumed
1        1        1        NA            NA
2        1        2        NA            NA
3        2        2         0             0
4        1        3        NA            NA
5        1        3        NA            NA
6        1        3        NA            NA

df1 %>%
  group_by( group.id ) %>%
  mutate( hits.consumed = -hits.diff )

  crawl.id group.id hits.diff hits.consumed
1        1        1        NA            NA
2        1        2        NA            NA
3        2        2         0             0
4        1        3        NA            NA
5        1        3        NA            NA
6        1        3        NA            NA

这是错误还是功能?任何人都可以复制这个吗? group_by、mutate 和 ifelse 的特定组合有什么特别之处导致它失败?

我自己的研究把我带到了这里: https://github.com/hadley/dplyr/issues/464 这表明它现在应该修复。

这里是dput(df1)

structure(list(crawl.id = c(1, 1, 2, 1, 1, 1), group.id = structure(c(1L, 
2L, 2L, 3L, 3L, 3L), .Label = c("1", "2", "3"), class = "factor"), 
    hits.diff = c(NA, NA, 0, NA, NA, NA)), .Names = c("crawl.id", 
"group.id", "hits.diff"), row.names = c(NA, -6L), class = "data.frame")

【问题讨论】:

  • 我也失败了。看起来该组需要至少一个非 NA 值才能正常工作。 IE。 df1[2:3,] %&gt;% group_by(group.id) %&gt;% mutate(hits.consumed = ifelse(hits.diff &lt;=0 , -hits.diff, 0)) 工作
  • 是的,你是对的。 df1[1:3,] 失败但 df1[2:3,] 有效。它似乎是旧 dplyr 问题 464 的转世。
  • 您可以将其作为问题提交

标签: r dplyr


【解决方案1】:

将其全部包装在 as.numeric 中以强制输出格式,因此默认为 logicalNAs 不会覆盖输出变量的类:

df1 %>%
  group_by(group.id) %>% 
  mutate( hits.consumed = as.numeric(ifelse(hits.diff<=0,-hits.diff,0)) )

#  crawl.id group.id hits.diff hits.consumed
#1        1        1        NA            NA
#2        1        2        NA            NA
#3        2        2         0             0
#4        1        3        NA            NA
#5        1        3        NA            NA
#6        1        3        NA            NA

很确定这与此处的问题相同:Custom sum function in dplyr returns inconsistent results,正如此结果所示:

out <- df1[1:2,] %>%  mutate( hits.consumed = ifelse(hits.diff <= 0, -hits.diff, 0))
class(out$hits.consumed)
#[1] "logical"
out <- df1[1:3,] %>%  mutate( hits.consumed = ifelse(hits.diff <= 0, -hits.diff, 0))
class(out$hits.consumed)
#[1] "numeric"

【讨论】:

  • 谢谢!你完全正确!我正在浏览问题 #489 和 @romainfrancois 响应 - 看起来这种行为是由 ifelse 为某些组返回的类型不一致引起的:逻辑组和某些组数字。您的解决方案通过在输入分组变异之前将其全部强制转换为数字来解决它。完美运行!
  • 谢谢。我整个上午都在努力解决这个问题!
  • @thelatemail,上面的查询工作正常,并给了我相应列的结果,但所有只有字母的列都没有值,字母数字和数字都是一样的。如何获取两个列的值。建议我
  • @thelatemail,它在我的 data.frame 中进行了微小的更改,效果很好。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2015-11-26
相关资源
最近更新 更多