R语言中如何选取DataFrame特定字符串行的下一行?
问题:从R语言不规则DataFrame中提取特定行数据
我有一个名为df的不规则DataFrame,需要从中提取特定行数据。
DataFrame构建代码
time <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) rate <- c("clarity: markerPos = None","clarity: markerPos = 0.99", "clarity: markerPos = 0.99", "clarity: markerPos = 0.99", "clarity: markerPos = None", "clarity: markerPos = None", "clarity: markerPos = 0.99", "clarity: markerPos = 0.99", "clarity: markerPos = 0.99", "clarity: markerPos = 0.99", "clarity: markerPos = None", "clarity: markerPos = None","clarity: markerPos = 0.97","clarity: markerPos = 0.97", "clarity: markerPos = None") df <- data.frame(time, rate) df
原始DataFrame输出
time rate 1 1 clarity: markerPos = None 2 2 clarity: markerPos = 0.99 3 3 clarity: markerPos = 0.99 4 4 clarity: markerPos = 0.99 5 5 clarity: markerPos = None 6 6 clarity: markerPos = None 7 7 clarity: markerPos = 0.99 8 8 clarity: markerPos = 0.99 9 9 clarity: markerPos = 0.99 10 10 clarity: markerPos = 0.99 11 11 clarity: markerPos = None 12 12 clarity: markerPos = None 13 13 clarity: markerPos = 0.97 14 14 clarity: markerPos = 0.97 15 15 clarity: markerPos = None
期望结果
我需要提取所有"clarity: markerPos = None"之后的第一个带数值的行,最终期望得到:
time rate 2 2 clarity: markerPos = 0.99 7 7 clarity: markerPos = 0.99 13 13 clarity: markerPos = 0.97
已尝试的代码
我已经能筛选出所有带数值的行,但结果包含连续重复的数值行:
library(stringr) df_new <- df[(str_detect(df$rate, "clarity: markerPos = 0.") | str_detect(df$rate, "clarity: markerPos = 1.")),] df_new
尝试结果
time rate 2 2 clarity: markerPos = 0.99 3 3 clarity: markerPos = 0.99 4 4 clarity: markerPos = 0.99 7 7 clarity: markerPos = 0.99 8 8 clarity: markerPos = 0.99 9 9 clarity: markerPos = 0.99 10 10 clarity: markerPos = 0.99 13 13 clarity: markerPos = 0.97 14 14 clarity: markerPos = 0.97
现在需要解决的问题是:如何在R语言中选取DataFrame某列中特定字符串所在行的下一行,进而得到目标结果?
解决方案
方法一:Base R实现
核心思路是标记None行的索引,取其下一行索引并去重,最后筛选有效行:
library(stringr) # 定位所有None行的索引 none_rows <- which(df$rate == "clarity: markerPos = None") # 获取None行的下一行索引 next_rows <- none_rows + 1 # 剔除超出DataFrame范围的索引 next_rows <- next_rows[next_rows <= nrow(df)] # 去重连续None行对应的重复下一行 unique_next_rows <- unique(next_rows) # 筛选出目标行,同时排除可能的None行 result <- df[unique_next_rows, ] result <- result[str_detect(result$rate, "\\d+\\.\\d+"), ] result
方法二:dplyr包实现(更简洁)
利用lag()函数判断当前行是否为None行的下一行,同时过滤无效行:
library(dplyr) library(stringr) result <- df %>% # 标记当前行是否是None行的下一行,且当前行是数值行 mutate(is_target = lag(rate) == "clarity: markerPos = None" & str_detect(rate, "\\d+\\.\\d+")) %>% # 筛选目标行 filter(is_target) %>% # 移除辅助列 select(-is_target) result
两种方法均可得到期望结果,其中dplyr写法更直观易读。
内容的提问来源于stack exchange,提问作者Fra
相关产品推荐
相关产品推荐

