处理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
相关产品推荐
相关产品推荐

