group_by和pmap在每组的每一行上进行分段操作(ifelse vs case_when)
我试图通过一个变量对_进行分组,然后对每个组的每行执行操作。我在使用ifelse vs case_时迷路了。两个词的用法之间有一些基本的东西我不理解。我假设两者都会给我相同的输出,但这里的情况并非如此。使用ifelse没有给出预期的输出,但是case_给出了预期的输出。我试图理解为什么ifelse没有给我预期的输出 下面是示例dfgroup_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),
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的值必须在所有情况下保持一致