gpt4 book ai didi

r - 基于具有很多条件的多列进行汇总

转载 作者:行者123 更新时间:2023-12-01 13:17:16 24 4
gpt4 key购买 nike

样本数据

df <- data.frame( id = 1:10,
group = c(1,1,1,1,1,2,2,2,2,2),
p1 = c("A", NA, "A", "A", "B", NA, NA, NA, NA, "C"),
p2 = c("F", NA, "G", "G", "A", "H", NA, NA, NA, NA),
stringsAsFactors = FALSE )

# id group p1 p2
# 1 1 1 A F
# 2 2 1 <NA> <NA>
# 3 3 1 A G
# 4 4 1 A G
# 5 5 1 B A
# 6 6 2 <NA> H
# 7 7 2 <NA> <NA>
# 8 8 2 <NA> <NA>
# 9 9 2 <NA> <NA>
# 10 10 2 C <NA>

我想按组汇总 df,以便从中获得总计列

  • 唯一的 id
  • 唯一 ID,其中任何 p 列的值都不是 NA
  • 唯一 ID,其中任何 p 列值等于“A”

期望的输出

data.frame( group = c(1,2),
total = c(5,5),
with_any_p = c(4,2),
with_any_p_is_A = c(4,0),
stringsAsFactors = FALSE)

# group total with_any_p with_any_p_is_A
# 1 1 5 4 4
# 2 2 5 2 0

到目前为止的代码

我知道我可以使用以下方法获得所需的输出:

df %>% group_by( group ) %>% 
summarise( total = n_distinct( id[] ),
with_any_p = n_distinct( id[ !is.na(p1) | ! is.na(p2) ] ),
with_any_p_is_A = n_distinct( id[ p1 == "A" | p2 == "A" ], na.rm = TRUE ) )

# # A tibble: 2 x 4
# group total with_any_p with_any_p_is_A
# <dbl> <int> <int> <int>
# 1 1 5 4 4
# 2 2 5 2 0

问题

但由于我的生产数据包含很多“p 列”,我不想重新输入上面的 or-statements p1-p100

我可以使用 filter_at 选择所需的行/子集:

p.cols <- paste0( "p", 1:2 )
#for with_any_p
df %>% filter_at( vars( p.cols ), any_vars( !is.na(.) ) )
#for with_any_p_is_A
df %>% filter_at( vars( p.cols ), any_vars( . == "A" ) )

但我现在知道如何将这些选择纳入摘要。

这能否以与我已有的代码相同的“风格”来完成,以便我一次性获得所需的结果,而不必绑定(bind)/加入多个结果?

最佳答案

这是使用初始宽到长转换的任意数量的 "p" 列的解决方案

df %>%
gather(key, val, -id, -group) %>%
group_by(group) %>%
summarise(
total = n_distinct(id),
with_any_p = n_distinct(id[!is.na(val)]),
with_any_p_is_A = n_distinct(id[val == "A"], na.rm = T))
## A tibble: 2 x 4
# group total with_any_p with_any_p_is_A
# <dbl> <int> <int> <int>
#1 1 5 4 4
#2 2 5 2 0

注释:我假设除了idgroup 之外的所有列都是"p" 列。如果不是这种情况,您可能必须更改 gather 语句以反射(reflect)更通用的列结构。

关于r - 基于具有很多条件的多列进行汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53613922/

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