gpt4 book ai didi

r - 如何基于向量对数据帧进行子集化,然后在 dplyr 中分组

转载 作者:行者123 更新时间:2023-12-04 11:19:19 25 4
gpt4 key购买 nike

我在 R 中有以下数据框

 ID        Blocks
123 2D
345 2E
324 2D
567 4F
678 5E
444 2D
145 2D

现在我想根据向量对数据帧进行子集化,然后在每个子集上应用分组依据

例如 vec <- c(2,3,2)现在首先它应该用前两行对数据框进行子集

 df <- df[1:2,]
df %>%
group_by(Blocks) %>%
summarise(count = n())

然后它应该用接下来的 3 行对数据帧进行子集化

 df <- df[3:5,]
df %>%
group_by(Blocks) %>%
summarise(count = n())

等等。所需的输出将是,

 Subset    2D    2E     4F     5E
2 1 1 0 0
3 1 0 1 1
2 2 0 0 0

我可以单独使用上面的代码,但是我的数据框很大,我必须多次对其进行子集化。我们怎样才能在 R 中更有效地做到这一点?

最佳答案

我们可以使用 rep 创建一个分组变量,用于将数据集拆分为“data.frame”的列表,然后使用map,获取count

library(tidyverse)
split(df, rep(seq_along(vec), vec)) %>%
map(~ .x %>%
count(Blocks))

或者另一种选择是基于 'vec' 创建一个 'grp' 列(以更符合预期的输出,即 'wide' 数据集,以及作为 'vec' 实际值的 'Subset' , 汇总以获得频率并将数据传播为“宽”格式

df %>%
filter(row_number() <= sum(vec)) %>% #based on the comments from OP
mutate(Subset = rep(vec, vec)) %>%
group_by(grp = rep(seq_along(vec), vec), Blocks) %>%
summarise(Subset = first(Subset), n = n())%>%
ungroup %>%
spread(Blocks, n, fill = 0) %>%
select(-grp)
# A tibble: 3 x 5
# Subset `2D` `2E` `4F` `5E`
#* <dbl> <dbl> <dbl> <dbl> <dbl>
#1 2.00 1.00 1.00 0 0
#2 3.00 1.00 0 1.00 1.00
#3 2.00 2.00 0 0 0

关于r - 如何基于向量对数据帧进行子集化,然后在 dplyr 中分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49279314/

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