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

处理DataFrame:提取连续行含共享字母的pos值生成新表

问题描述

我有一个结构如下的R DataFrame:

pos<- c(67,125,158,195,235,458,499,526,785,912,999,1525)
v_1<-c("j","c","v","r","s","q","r","r","s","t","u","v")
v_2<-c("c","t","v","r","s","q","r","w","c","c","o","v")
v_3<-c("z","c","v","r","s","q","r","w","c","b","p","v")
v_4<-c("x","w","z","z","s","q","r","w","c","o","t","v")
data<-as.data.frame(cbind(pos,v_1,v_2,v_3,v_4))

需要生成一个新的DataFrame,要求包含连续行之间存在共享字母对应的pos值,规则如下:

  • 只关注连续的两行(第i行与第i+1行)
  • 若两行的v_1~v_4列中存在至少一个相同字母,则提取这两行的pos值
  • 注意:pos为1525的行虽自身列字母全相同,但无相邻的共享字母行,因此不纳入结果
解决方案

可以通过遍历连续行对、检查字母交集的方式实现,代码如下:

# 修正pos列的数值类型(cbind会默认转成字符型)
data$pos <- as.numeric(data$pos)

# 初始化结果容器
result <- list()

# 遍历每一组连续行
for (i in seq_len(nrow(data)-1)) {
  # 获取两行的字母集合
  current_row <- unlist(data[i, -1])
  next_row <- unlist(data[i+1, -1])
  # 检查是否有共同字母
  if (length(intersect(current_row, next_row)) > 0) {
    result[[length(result)+1]] <- data.frame(pos1 = data$pos[i], pos2 = data$pos[i+1])
  }
}

# 合并为最终DataFrame
result_df <- do.call(rbind, result)

运行后得到的结果如下:

pos1 pos2
1   67  125
2  125  158
3  158  195
4  195  235
5  235  458
6  458  499
7  499  526
8  785  912

内容的提问来源于stack exchange,提问作者Francisco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:45:37