我在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
Run Code Online (Sandbox Code Playgroud)
当我使用它时,以下代码
library(dplyr)
df1 %>%
group_by(group.id) %>%
mutate( hits.consumed = ifelse(hits.diff<=0,-hits.diff,0) )
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我得到了
Error: incompatible types, expecting a logical vector**
Run Code Online (Sandbox Code Playgroud)
但是,删除任何一个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 …Run Code Online (Sandbox Code Playgroud) 我想知道以下问题是否在dplyr中有一个优雅的解决方案.
要提供简单的可重现示例,请考虑以下data.frame:
df <- data.frame( a=1:5, b=2:6, c=3:7,
ref=c("a","a","b","b","c"),
stringsAsFactors = FALSE )
Run Code Online (Sandbox Code Playgroud)
这里a,b,c是常规数值变量,同时ref意味着引用其列是该观察"主"的价值.例如:
a b c ref
1 1 2 3 a
2 2 3 4 a
3 3 4 5 b
4 4 5 6 b
5 5 6 7 c
Run Code Online (Sandbox Code Playgroud)
例如,对于观察3,ref==b因此列b包含主要值.而对于观察1,ref==a因此列a包含主要值.
有了这个data.frame,问题就是main使用dplyr 创建每个观察值的新列.
a b c ref main
1 1 2 3 a 1
2 …Run Code Online (Sandbox Code Playgroud)