gpt4 book ai didi

r - 选择 group_by 中的值并根据 R 中的另一列值进行汇总

转载 作者:行者123 更新时间:2023-12-05 05:13:02 27 4
gpt4 key购买 nike

在下面的示例中,我将如何根据另一个列中的条件 (carb == 1)。请注意,我还想总结另一个变量(平均每组 qsec)。我在下面的最佳猜测出错了:

library(dplyr)
mtcars %>%
distinct(cyl, carb, .keep_all = TRUE) %>%
group_by(cyl) %>%
summarize(
mpg = mpg[.$carb == 1],
qsec = mean(qsec)
)

最佳答案

如果有多个行的 'carb' 为 1 并且 summarise 每组仅返回一行或没有任何组,最好将输出包装在 list 中。如果我们使用 $,它会破坏分组

library(tidyverse)
out <- mtcars %>%
distinct(cyl, carb, .keep_all = TRUE) %>%
group_by(cyl) %>%
summarize(
mpg = list(mpg[carb == 1]),
qsec = mean(qsec)
)

out
# A tibble: 3 x 3
# cyl mpg qsec
# <dbl> <list> <dbl>
#1 4 <dbl [1]> 19.3
#2 6 <dbl [1]> 17.1
#3 8 <dbl [0]> 16.2

通过查看输出,对于“cyl”8,没有等于 1 的“carb”。这导致 numeric(0)

通过用replace_na包裹,可以将长度为0的元素更改为NA,然后执行unnest。否则,正如@Dave Gruenewald 在评论中提到的那样,该行可以在 unnesting

时自动删除
out %>% 
mutate(mpg = replace_na(mpg)) %>%
unnest
# A tibble: 3 x 3
# cyl qsec mpg
# <dbl> <dbl> <dbl>
#1 4 19.3 22.8
#2 6 17.1 21.4
#3 8 16.2 NA

另一种选择,如果我们已经知道 'carb' 中最多有 1 个元素等于 1,则在 summarise 中使用 if/else 条件>

mtcars %>%
distinct(cyl, carb, .keep_all = TRUE) %>%
group_by(cyl) %>%
summarise(
mpg = if(any(carb == 1)) mpg[carb==1] else NA_real_,
qsec = mean(qsec)
)
# A tibble: 3 x 3
# cyl mpg qsec
# <dbl> <dbl> <dbl>
#1 4 22.8 19.3
#2 6 21.4 17.1
#3 8 NA 16.2

但是,最好假设可能有多个“carb”值,每个“cyl”都为 1,并将其包装在 list 中,稍后 unnest

mtcars %>%
distinct(cyl, carb, .keep_all = TRUE) %>%
group_by(cyl) %>%
summarise(
mpg = list(if(any(carb == 1)) mpg[carb==1] else NA_real_),
qsec = mean(qsec)) %>%
unnest

关于r - 选择 group_by 中的值并根据 R 中的另一列值进行汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54010614/

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