我有以下数据框:
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"))
答案 0 :(得分:1)
使用dplyr
和tidyr
,您可以运行以下代码:
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 强>