Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr mutate ifelse返回组的第一个值而不是按行_R_Dplyr - Fatal编程技术网

dplyr mutate ifelse返回组的第一个值而不是按行

dplyr mutate ifelse返回组的第一个值而不是按行,r,dplyr,R,Dplyr,我正在尝试使用ifelse对data.frame进行变异: df = data.frame(grp = c('a', 'a', 'a', 'b', 'b', 'b'), value1 = c(0, 0, 0, 0, 1, 2), value2 = 1:6) df %>% group_by(grp) %>% mutate(value2 = ifelse(all(value1 == 0), 0, value

我正在尝试使用ifelse对data.frame进行变异:

df = data.frame(grp = c('a', 'a', 'a', 'b', 'b', 'b'), 
                value1 = c(0, 0, 0, 0, 1, 2), 
                value2 = 1:6)


df %>% 
  group_by(grp) %>%
  mutate(value2 = ifelse(all(value1 == 0), 0, value2))
返回

# # A tibble: 6 x 3
# # Groups:   grp [2]
#  grp   value1 value2
# <chr>  <dbl>  <dbl>
# 1 a          0      0
# 2 a          0      0
# 3 a          0      0
# 4 b          0      4
# 5 b          1      4
# 6 b          2      4
##一个tible:6x3
##分组:grp[2]
#grp值1值2
#     
#1 a 0 0
#2 a 0 0
#3 a 0 0
#4B04
#5b14
#6 b 2 4
而不是

# # A tibble: 6 x 3
# # Groups:   grp [2]
#  grp   value1 value2
# <chr>  <dbl>  <dbl>
# 1 a          0      0
# 2 a          0      0
# 3 a          0      0
# 4 b          0      4
# 5 b          1      5
# 6 b          2      6
##一个tible:6x3
##分组:grp[2]
#grp值1值2
#     
#1 a 0 0
#2 a 0 0
#3 a 0 0
#4B04
#5b15
#6B26

如果条件为false,如何更改
mutate
,使“value2”的行保持不变?

您可以使用
if
else
而不是
ifelse()

df%>%
分组依据(grp)%>%
变异(value2=if(all(value1==0))0其他值2)
grp值1值2
1 a 0 0
2 a 0 0
3 a 0 0
4B04
5b15
6B26

您可以尝试使用
ifelse
作为掩码,例如

df %>% 
  group_by(grp) %>%
  mutate(value2 = ifelse(all(value1 == 0), 0, 1)*value2)
或者(感谢@tmfmnk的评论)

  grp   value1 value2
  <chr>  <dbl>  <dbl>
1 a          0      0
2 a          0      0
3 a          0      0
4 b          0      4
5 b          1      5
6 b          2      6

很酷,我不知道它们可以在mutate内部那样使用。在这种情况下,
df%>%groupby(grp)%%>%mutate(value2=any(value1!=0)*value2)
会更合理,不是吗?@tmfmnk是的,更合理。
df %>%   
  group_by(grp) %>%  
  mutate(value2 = any(value1 != 0)*value2)
  grp   value1 value2
  <chr>  <dbl>  <dbl>
1 a          0      0
2 a          0      0
3 a          0      0
4 b          0      4
5 b          1      5
6 b          2      6
df %>% 
  group_by(grp) %>%
  mutate(value2 = ifelse(rep(all(value1 == 0),n()), 0, value2))