如何在dplyr中基于向量对数据帧进行子集,然后按分组
我在R中有以下数据帧如何在dplyr中基于向量对数据帧进行子集,然后按分组,r,R,我在R中有以下数据帧 ID Blocks 123 2D 345 2E 324 2D 567 4F 678 5E 444 2D 145 2D 现在我想基于向量对dataframe进行子集划分,然后对每个子集进行分组 e、 g vec我们可以使用rep创建一个分组变量,用于将数据集拆分为“data.frame”列表,然后使用map获得计数 或者,另一个选项是基于“vec”创建一列“gr
ID Blocks
123 2D
345 2E
324 2D
567 4F
678 5E
444 2D
145 2D
现在我想基于向量对dataframe进行子集划分,然后对每个子集进行分组
e、 g vec我们可以使用rep创建一个分组变量,用于将数据集拆分为“data.frame”列表,然后使用map获得计数
或者,另一个选项是基于“vec”创建一列“grp”,以便与“宽”数据集的预期输出更加一致,以及作为“vec”实际值的“子集”,汇总以获得频率,并将数据扩展为“宽”格式
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
我有另一个答案,在这里使用akrun的另一个伟大想法。然后只需对repseqvec、vec创建的每个组求和,结果非常简单:
library(dplyr)
df2 <- as.data.frame.matrix(table(seq(nrow(df)),df$Blocks))
df2 %>%
group_by(grp = rep(seq(vec), vec)) %>%
summarise_all(sum)%>%
mutate(grp=vec)
# A tibble: 3 x 5
grp `2D` `2E` `4F` `5E`
<dbl> <int> <int> <int> <int>
1 2 1 1 0 0
2 3 1 0 1 1
3 2 2 0 0 0
谢谢你的回答。现在我的数据框有2086个观测值,这里是vec@Neil,你展示的向量的和是7,行数是7。我不理解通过“vec”复制“2086”的逻辑。在评论中,vec的总数为188。你能详细说明一下规则吗。似乎很模糊的想法是根据指定的向量对行进行子集。e、 我有100行和我的vec完美,这就是我需要的。非常感谢:@akrun我从你众多和蔼可亲的回答中找到了一个非常简单的解决方案:
Subset 2D 2E 4F 5E
2 1 1 0 0
3 1 0 1 1
2 2 0 0 0
library(tidyverse)
split(df, rep(seq_along(vec), vec)) %>%
map(~ .x %>%
count(Blocks))
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
library(dplyr)
df2 <- as.data.frame.matrix(table(seq(nrow(df)),df$Blocks))
df2 %>%
group_by(grp = rep(seq(vec), vec)) %>%
summarise_all(sum)%>%
mutate(grp=vec)
# A tibble: 3 x 5
grp `2D` `2E` `4F` `5E`
<dbl> <int> <int> <int> <int>
1 2 1 1 0 0
2 3 1 0 1 1
3 2 2 0 0 0