在R

时间:2018-01-17 21:34:33

标签: arrays r dataframe group-by dplyr

我有以下数据框:

x <- data.frame("A"=c(rep(4,3),rep(7,4),rep(2,2)),
                "B"=c("Q","Y"," ","F","Q"," ","Z","Q","C"),
                "C"=seq(1:9))
  • A是我的分组变量/因子

  • B状态标志我在第一次出现后进行子集化。 我已经设法将 固定 行的数量进行了子集,只需将行数添加到B&S的索引中,其中&#34; Q& #34;出现:

这样的事情:x[c(which(x$B=="Q"),which(x$B=="B")+1),]

&#34; + 1&#34;因为我对#34; Q&#34;之后的第一行感兴趣发生。

现在我需要&#34; Q&#34;之后我需要 每个组中的其余行 。发生了(包括Q的行),我一直在我的桌子上撞击我试图弄清楚如何使用dplyr包装进行分组,因此我就在这里。

请帮帮忙?

------编辑-----

这似乎有效

x %>% group_by(A) %>% filter(row_number()>=which.max(B=="Q"))

2 个答案:

答案 0 :(得分:1)

使用dplyrtidyr,您可以运行以下代码:

mydf <- data.frame("A"=c(rep(4,3),rep(7,4),rep(2,2)),
                "B"=c("Q","Y"," ","F","Q"," ","Z","Q","C"),
                "C"=seq(1:9))

library(tidyverse)
mydf %>%
    group_by(A) %>% 
    mutate(selector=case_when(
        B=="Q" ~ 1
    )) %>% 
    fill(...=selector,.direction="down") %>% 
    filter(selector==1) %>% 
    select(-selector)) %>% 
    arrange(C,A) 

这就是结果:

      A B         C
  <dbl> <fct> <int>
1  4.00 Q         1
2  4.00 Y         2
3  4.00 " "       3
4  7.00 Q         5
5  7.00 " "       6
6  7.00 Z         7
7  2.00 Q         8
8  2.00 C         9

答案 1 :(得分:1)

这是你要找的吗?

q_rows <- row.names(subset(x, B == 'Q')) # rows where Q occurs 
list_of_frames <- list()
for(i in 1:length(q_rows)) {
    q_start <- as.numeric(q_rows[i]);
    q_group <- as.numeric(x[q_start,c('A')])
    group_frame <- subset(x[q_start:nrow(x),], A == q_group)
    list_of_frames[i] <- list(group_frame)
    }

<强> list_of_frames

enter image description here