如何在R语言DataFrame中提取含error行对应的前置ID行
问题解决
首先修正你的DataFrame定义,date列的括号要改成c(),否则R会报错:
df <- data.frame( date = c(1,1,1,1,rep(2, 36)), action = c("ID=1", "foo","bah", "error", "ID=2", "foo","bah", "success", "ID=3", "foo","bah", "error", "ID=4", "foo","bah", "success", "ID=5", "foo","bah", "success", "ID=6", "foo","bah", "error", "ID=7", "foo","bah", "error", "ID=8", "foo","bah", "success", "ID=9", "foo","bah", "success", "ID=10", "foo","bah", "success" ) )
你的现有代码逻辑错误:过滤出action为error的行后,无论怎么切片,得到的都是error本身的行,而不是对应的ID行。下面提供两种可行方案:
方案一:分组筛选(dplyr)
利用每组4行的规律,先分组,再筛选出组内最后一行是error的组,取组内第一行(即ID行):
library(dplyr) df %>% mutate(group_id = rep(1:(nrow(.)/4), each = 4)) %>% group_by(group_id) %>% filter(last(action) == "error") %>% slice(1) %>% ungroup() %>% select(date, action)
方案二:索引定位
直接找到所有error行的位置,减去3得到对应ID行的索引,再提取数据:
error_rows <- which(df$action == "error") result <- df[error_rows - 3, c("date", "action")]
两种方案都能得到你想要的结果:
date action 1 1 ID=1 2 2 ID=3 3 2 ID=6 4 2 ID=7
内容的提问来源于stack exchange,提问作者Anthony W
相关产品推荐
相关产品推荐

