R语言中按用户组选择action列第一个V之后的所有行
在R语言中按用户分组筛选第一个'V'出现后的所有行
需求:按user列分组,保留每个组内action列中第一个'V'出现之后的所有行(包含该行)。
示例数据
df <- read.table(text=" user action 1 D 1 D 1 P 1 E 1 V 1 D 1 D 2 E 2 V 2 V 2 P", header=T, stringsAsFactors=F)
解决方案
方法1:使用dplyr包(tidyverse风格)
通过分组后定位第一个'V'的位置,筛选该行及后续所有行:
library(dplyr) result <- df %>% group_by(user) %>% filter(row_number() >= which(action == 'V')[1]) %>% ungroup() print(result)
方法2:使用base R
拆分数据框为分组列表,逐个处理后合并结果:
# 按user拆分数据框 df_groups <- split(df, df$user) # 处理每个分组:筛选第一个'V'及之后的行 processed_groups <- lapply(df_groups, function(group) { first_v_idx <- which(group$action == 'V')[1] if (!is.na(first_v_idx)) { group[first_v_idx:nrow(group), ] } else { # 组内无'V'时返回空数据框(可按需调整) group[0, ] } }) # 合并分组结果并重置行名 result_base <- do.call(rbind, processed_groups) rownames(result_base) <- NULL print(result_base)
预期输出
两种方法均会得到如下结果:
user action 1 1 V 2 1 D 3 1 D 4 2 V 5 2 V 6 2 P
内容的提问来源于stack exchange,提问作者Cina
相关产品推荐
相关产品推荐

