dplyr错误:组合group_by、mutate和ifelse时出现奇怪的问题。是虫子吗?
我对dplyr和groupby、mutate和ifelse的组合有一些奇怪的问题。考虑下面的数据.框架< /P>dplyr错误:组合group_by、mutate和ifelse时出现奇怪的问题。是虫子吗?,r,dplyr,R,Dplyr,我对dplyr和groupby、mutate和ifelse的组合有一些奇怪的问题。考虑下面的数据.框架< /P> > 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
> 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) )
但是,删除groupby()
或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
将其全部包装在
as.numeric
中以强制输出格式,这样默认情况下NA
s是logical
,不会覆盖输出变量的类:
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
df1%>%
分组依据(组id)%>%
mutate(hits.consumered=as.numeric(ifelse)(hits.diffIt对我来说也失败。看起来组需要至少一个非NA值才能工作。例如,df1[2:3,]%%>%group_by(group.id)%%>%mutate(hits.consumered=ifelse(hits.diff是的,你是正确的。df1[1:3,]
仍失败df1[2:3,]
有效。它似乎是旧dplyr版本464的转世。你可以将其作为一个发行版提交!你完全正确!我正在浏览该版本#489和@romainfrancois响应——看起来这种行为是由ifelse
为某些组返回的不一致类型造成的:逻辑组和数字组。你的解决方案是在输入分组变异之前将其强制转换为数字。效果非常好!谢谢。我整个上午都在努力解决这个问题!@thelatemail,上面的查询工作得很好,并给了我相应列的结果,但所有只有字母的列都没有值,字母数字是原样的,num是原样的eric就是这样。如何获取列的两个值。建议me@thelatemail,在我的data.frame中做了一些小改动,但效果很好。谢谢:)
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")
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
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"