合并相邻行中特征相同的数据--循环版

这个问题其实很早就出现了,以前一直是在excel里手工操作,累眼累手费鼠标,用了R以后就一直想偷懒,昨天领到一份新数据的时候,就开始琢磨怎么弄。

数据demo和期待的结果:

longcan2 <- read.csv("lc2.csv")
head(longcan2)

序号 起始井深 结束井深 层位 分析结果

1 1 33 34 S1w 砂质泥岩

2 2 34 35 S1w 砂质泥岩

3 3 35 36 S1w 砂质泥岩

4 4 36 37 S1w 泥质砂岩

5 5 37 38 S1w 泥质砂岩

6 6 38 39 S1w 泥质砂岩

期待的结果

序号 起始井深 结束井深 层位 分析结果

3 3 33 36 S1w 砂质泥岩

12 12 36 48 S1w 泥质砂岩

18 18 48 66 S1w 砂质泥岩

40 40 66 135 S1w 泥岩

41 41 135 138 S1w 砂岩

47 47 138 156 S1w 泥岩

实际上难度不太大,就是判断相邻的两行数据,如果某些属性是相同的,就合并成一条数据,分别取上一条数据和下一条数据的某些值来组合。

遇到的第一个难题是编码问题,汗。。。

越来越恨win平台的gbk神马了,为什么不能全部改成UTF-8?捣鼓了很久,将数据存为csv,然后用notepad++转为utf-8,R读进去数据了,不过都是乱码,最后还是弄到ubuntu下,LibreOffice转为csv,编码问题算是迈过去了,如果哪个大神路过,请指点一下win平台下如何默认设置成UTF-8编码,以免每次都折腾。。。

数据处理过程很简单,就是一个for循环。。。那些明文禁止写for循环的大佬估计不会路过此地,所以明目张胆的帖出来了。第一次的for循环有点问题,首先判断关键字段是否一致,如果一致,则把需要合并的这条数据和下一条数据合并,删除下一条数据,继续循环,功能倒是实现了,不过每次都只能把部分满足条件的数据合并,还有一堆数据站在原地嘲笑我这个for循环,需要连续运行五六次for循环才能得到最终的结果。

next

i <- 1 for (i in 1:nrow(longcan2)){ #第4-5列为层位和岩性,第3列为底界井深 if(longcan2[i,4]==longcan2[i+1,4] & longcan2[i,5]==longcan2[i+1,5]){ longcan2[i,(3:5)] <- longcan2[i+1,(3:5)] longcan2 <- longcan2[-(i+1),] } } write.csv(data.frame(longcan2),"lc2newself.csv")

晚上睡觉的时候一直在做梦,梦到向量化处理和这个for循环,突然半夜想起这个for循环的问题,每次删除了下一条数据的时候,导致循环过程中需要漏掉了一半的数据,那么,不在循环过程中删除数据呢,只做一个标记,处理完以后统一来处理不就可以了吗?于是有了这个改进版的for循环。。。

last

i <- 2 for (i in 2:nrow(longcan2)){ #第4-5列为层位和岩性,第3列为底界井深,第2列为顶界井深 if(longcan2[i,4]==longcan2[i-1,4] & longcan2[i,5]==longcan2[i-1,5]){ longcan2[i,2] <- longcan2[i-1,2] longcan2[i-1,] <- NA } } lc2 <- na.omit(longcan2) write.csv(data.frame(lc2),"lc2new.csv")

这下终于一次到位了,虽然还是一个for循环。。。

实际上还存在一个隐患,没有判断行与行之间的数据是否连续,因为这个数据体是连续的,所以没出现问题,要判断也很简单,假设第2、3列是关键列,那在if中增加一个df[i,2]==df[i-1,3]即可。

如果不用for,该怎么处理呢??

希望今晚不再继续做梦。。。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注