group_by和pmap在每组的每一行上进行分段操作(ifelse vs case_when)

group_by和pmap在每组的每一行上进行分段操作(ifelse vs case_when),r,dplyr,R,Dplyr,我试图通过一个变量对_进行分组,然后对每个组的每行执行操作。我在使用ifelse vs case_时迷路了。两个词的用法之间有一些基本的东西我不理解。我假设两者都会给我相同的输出,但这里的情况并非如此。使用ifelse没有给出预期的输出,但是case_给出了预期的输出。我试图理解为什么ifelse没有给我预期的输出 下面是示例df structure(list(Pos = c(73L, 146L, 146L, 150L, 150L, 151L, 151L, 152L, 182L, 182L),

我试图通过一个变量对_进行分组,然后对每个组的每行执行操作。我在使用ifelse vs case_时迷路了。两个词的用法之间有一些基本的东西我不理解。我假设两者都会给我相同的输出,但这里的情况并非如此。使用ifelse没有给出预期的输出,但是case_给出了预期的输出。我试图理解为什么ifelse没有给我预期的输出

下面是示例df

structure(list(Pos = c(73L, 146L, 146L, 150L, 150L, 151L, 151L, 
152L, 182L, 182L), Percentage = c(81.2, 13.5, 86.4, 66.1, 33.9, 
48.1, 51.9, 86.1, 48, 52)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame")) -> foo
我是按Pos分组的,如果它们的总和是100,我想舍入百分比。以下内容正在使用ifelse:

library(tidyverse)
foo %>% 
     group_by(Pos) %>%
     mutate(sumn = n()) %>% 
     mutate(Val = ifelse(sumn == 1,100,
                         ifelse(sum(Percentage) == 100, unlist(map(Percentage,round)), 0)
                         # case_when(sum(Percentage) == 100 ~ unlist(map(Percentage,round)),
                         #           TRUE ~ 0
                         # )
                         ))
输出是

# A tibble: 10 x 4
# Groups:   Pos [6]
     Pos Percentage  sumn   Val
   <int>      <dbl> <int> <dbl>
 1    73       81.2     1   100
 2   146       13.5     2     0
 3   146       86.4     2     0
 4   150       66.1     2    66
 5   150       33.9     2    66
 6   151       48.1     2    48
 7   151       51.9     2    48
 8   152       86.1     1   100
 9   182       48       2    48
10   182       52       2    48
#一个tible:10 x 4
#组别:Pos[6]
销售金额百分比
1    73       81.2     1   100
2   146       13.5     2     0
3   146       86.4     2     0
4   150       66.1     2    66
5   150       33.9     2    66
6   151       48.1     2    48
7   151       51.9     2    48
8   152       86.1     1   100
9   182       48       2    48
10   182       52       2    48
我不想要这个,而是想要下面我在使用case_时得到的

   foo %>% 
     group_by(Pos) %>%
     mutate(sumn = n()) %>% 
     mutate(Val = ifelse(sumn == 1,100,
                         #ifelse(sum(Percentage) == 100, unlist(map(Percentage,round)), 0)
                         case_when(sum(Percentage) == 100 ~ unlist(map(Percentage,round)),
                                   TRUE ~ 0
                         )
                         ))

# A tibble: 10 x 4
# Groups:   Pos [6]
     Pos Percentage  sumn   Val
   <int>      <dbl> <int> <dbl>
 1    73       81.2     1   100
 2   146       13.5     2     0
 3   146       86.4     2     0
 4   150       66.1     2    66
 5   150       33.9     2    34
 6   151       48.1     2    48
 7   151       51.9     2    52
 8   152       86.1     1   100
 9   182       48       2    48
10   182       52       2    52
foo%>%
分组依据(Pos)%>%
突变(sumn=n())%>%
变异(Val=ifelse)(sumn=1100,
#ifelse(总和(百分比)==100,未列出(映射(百分比,舍入)),0)
当(总和(百分比)==100~未列出(映射(百分比,四舍五入))时,
真~0
)
))
#一个tibble:10x4
#组别:Pos[6]
销售金额百分比
1    73       81.2     1   100
2   146       13.5     2     0
3   146       86.4     2     0
4   150       66.1     2    66
5   150       33.9     2    34
6   151       48.1     2    48
7   151       51.9     2    52
8   152       86.1     1   100
9   182       48       2    48
10   182       52       2    52

ifelse有什么不同吗?

根据
?ifelse

与“是”或“否”值中的测试值和数据值具有相同长度和属性(包括尺寸和“类别”)的向量

如果我们复制使长度相同,那么它应该可以工作

foo %>% 
      group_by(Pos) %>%
      mutate(sumn = n()) %>% 
      mutate(Val = ifelse(sumn == 1,100,
                          ifelse(rep(sum(Percentage) == 100, 
                      n()), unlist(map(Percentage,round)), 0)                            
                          ))
# A tibble: 10 x 4
# Groups:   Pos [6]
     Pos Percentage  sumn   Val
   <int>      <dbl> <int> <dbl>
 1    73       81.2     1   100
 2   146       13.5     2     0
 3   146       86.4     2     0
 4   150       66.1     2    66
 5   150       33.9     2    34
 6   151       48.1     2    48
 7   151       51.9     2    52
 8   152       86.1     1   100
 9   182       48       2    48
10   182       52       2    52
foo%>%
分组依据(Pos)%>%
突变(sumn=n())%>%
变异(Val=ifelse)(sumn=1100,
ifelse(代表(总和(百分比)=100,
n()),未列出(映射(百分比,舍入)),0)
))
#一个tibble:10x4
#组别:Pos[6]
销售金额百分比
1    73       81.2     1   100
2   146       13.5     2     0
3   146       86.4     2     0
4   150       66.1     2    66
5   150       33.9     2    34
6   151       48.1     2    48
7   151       51.9     2    52
8   152       86.1     1   100
9   182       48       2    48
10   182       52       2    52

总和(百分比)
是一个单一值,正在回收利用。我想你需要
if/else
使用ifelse,它可以循环使用,但case\u可以正常工作。为什么ifelse会回收它,而case_不会回收呢?
case_当
也会回收,但是
LHS和RHS的长度可能是1或n。n的值必须在所有情况下保持一致