Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在dplyr中基于向量对数据帧进行子集,然后按分组_R - Fatal编程技术网

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

如何在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

我在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”创建一列“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