You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:45:17