gpt4 book ai didi

r - 分组 case_when 返回重复行

转载 作者:行者123 更新时间:2023-12-04 12:30:34 24 4
gpt4 key购买 nike

我按标识符分组(标识符可能有多行),然后尝试使用 group_by 为每个标识符创建一个唯一的行+ summarizecase_when .这个想法是,如果有 2 行或更多行,则返回单个预设值,否则返回原始值。问题是 case_when 返回具有预设值的重复行。如何确保输出是唯一的?我可以使用 distinct但我的期望是值(value)已经是独一无二的。 dplyr v. 1.0.7
移动电源

library(tidyverse)

dat <- tibble(
id = c(1, 1, 2, 3, 4, 4, 5),
fav_color = c('red', 'blue', 'red', 'green', 'white', 'black', 'pink')
)


dat %>%
group_by(id) %>%
summarize(
fav_color = case_when(
n() > 1 ~ 'Multiple Colors',
n() == 1 ~ fav_color
)
)
返回
# A tibble: 7 x 2
# Groups: id [5]
id fav_color
<dbl> <chr>
1 1 Multiple Colors
2 1 Multiple Colors
3 2 red
4 3 green
5 4 Multiple Colors
6 4 Multiple Colors
7 5 pink
我要什么ifelse给出:
dat %>%
group_by(id) %>%
summarize(
fav_color = ifelse(n() > 1, 'Multiple Colors', fav_color)
)
# A tibble: 5 x 2
id fav_color
<dbl> <chr>
1 1 Multiple Colors
2 2 red
3 3 green
4 4 Multiple Colors
5 5 pink
备注 使用字符输出进行最终返回会产生正确的行数:
dat %>%
group_by(id) %>%
summarize(
fav_color = case_when(
n() > 1 ~ 'Multiple Colors',
n() == 1 ~ 'Single Color'
)
)
# A tibble: 5 x 2
id fav_color
<dbl> <chr>
1 1 Multiple Colors
2 2 Single Color
3 3 Single Color
4 4 Multiple Colors
5 5 Single Color

最佳答案

case_when 的问题是它评估所有值的所有输出,即使条件不满足。
考虑这个例子 -

library(dplyr)

a <- c(1, 2, 3, 4)
case_when(a > 0 ~ a * 2,
a < 0 ~ 'a' * 2)

Error in "a" * 2 : non-numeric argument to binary operator


所以在你的情况下 n() == 1 ~ fav_color对每个组执行。由于具有多于一行的组将具有多于一个 fav_color 的值。它将输出中的行数保持为原始数据帧。解决方案是使用@theQi 建议的汇总函数,该函数将始终返回长度为 1 的输出。
dat %>%
group_by(id) %>%
summarize(
fav_color1 = case_when(
n() > 1 ~ 'Multiple Colors',
n() == 1 ~ fav_color[1]
)
)

# A tibble: 5 x 2
# id fav_color1
# <dbl> <chr>
#1 1 Multiple Colors
#2 2 red
#3 3 green
#4 4 Multiple Colors
#5 5 pink

与问题无关,但值得了解的是 fcase来自 data.table是不同的。它仅在需要时评估输出。
a <- c(1, 2, 3, 4)

data.table::fcase(a > 0, a * 2,
a < 0, 'a' * 2)


#[1] 2 4 6 8

关于r - 分组 case_when 返回重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69378603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com