用顶部和底部元素替换行元素

时间:2014-03-20 14:46:14

标签: r

我的数据框如下:

未分类的数据:

id  V1  V2  V3  V4  V5  V6  V7  V8  V9  V10
M1  SM1 137 137 +   SM1 168 255 +   xxl 31
M2  SM1 3026005 3026005 -   SM1 3025051 3026062 +   xmu 0
M3  SM1 308128  308128  -   SM1 306713  308597  -   ucl 0
M4  SM1 3027792 3027792 -   SM1 3026280 3028359 +   oml 0
M5  SM1 308129  308129  -   SM1 306713  308597  -   uul 0
M6  SM1 3029695 3029695 -   SM1 3028946 3029864 +   oma 0
M7  SM1 3029738 3029738 -   SM1 3028946 3029864 +   oma 0
M8  SM1 3030415 3030415 +   SM1 3029860 3030682 +   omu 0
M9  SM1 3057386 3057386 -   SM1 3056910 3057822 -   ucle    0
M10 SM1 3069715 3069715 +   SM1 3069459 3069567 +   ohm 148
M11 SM1 3097751 3097751 -   SM1 3096951 3097860 -   umn 0
M12 SM1 3098025 3098025 +   SM1 3098110 3099157 +   icy 85
M14 SM1 3099816 3099816 -   SM1 3100255 3100552 -   occl    439
M15 SMP 3100015 3100015 -   SMP 3100255 3100552 -   occl    240
M16 SMP 3103300 3103300 +   SMP 3104483 3106040 +   abl 183
M17 SMP 3116858 3116858 -   SMP 3115395 3116193 -   zyc 665
M18 SMP 3121053 3121053 -   SMP 3120207 3121845 -   umq 0
M19 SMP 3121957 3121957 +   SMP 3120207 3121845 -   umq 112

按以下顺序排序数据:数据$ V8,数据$ V7,数据$ V1,以便进行有效分析。

排序数据:

id  V1  V2  V3  V4  V5  V6  V7  V8  V9  V10
M3  SM1 308128  308128  -   SM1 306713  308597  -   ucl 0
M5  SM1 308129  308129  -   SM1 306713  308597  -   uul 0
M9  SM1 3057386 3057386 -   SM1 3056910 3057822 -   ucle    0
M11 SM1 3097751 3097751 -   SM1 3096951 3097860 -   umn 0
M14 SM1 3099816 3099816 -   SM1 3100255 3100552 -   occl    439
M15 SMP 3100015 3100015 -   SMP 3100255 3100552 -   occl    240
M17 SMP 3116858 3116858 -   SMP 3115395 3116193 -   zyc 665
M18 SMP 3121053 3121053 -   SMP 3120207 3121845 -   umq 0
M19 SMP 3121957 3121957 +   SMP 3120207 3121845 -   umq 112
M1  SM1 137 137 +   SM1 168 255 +   xxl 31
M2  SM1 3026005 3026005 -   SM1 3025051 3026062 +   xmu 0
M4  SM1 3027792 3027792 -   SM1 3026280 3028359 +   oml 0
M6  SM1 3029695 3029695 -   SM1 3028946 3029864 +   oma 0
M7  SM1 3029738 3029738 -   SM1 3028946 3029864 +   oma 0
M8  SM1 3030415 3030415 +   SM1 3029860 3030682 +   omu 0
M10 SM1 3069715 3069715 +   SM1 3069459 3069567 +   ohm 148
M12 SM1 3098025 3098025 +   SM1 3098110 3099157 +   icy 85
M16 SMP 3103300 3103300 +   SMP 3104483 3106040 +   abl 183

我的目标是对排序数据执行以下操作:

  1. 如果数据$ V10> 0&数据$ V1 ==数据$ V5&数据$ V4 ==数据$ V8,然后
  2. 将第V9行的行内容替换为“Beween_TopRowElement-BottomRowElement” (如果TopRowElement和BottomRowElement与第v9行的行中的元素不同)
  3. 示例“occl”,其ID为M15,位于col V9中,大于0,因此将替换为“Between_umn_zyc”, 由于TopRowElement与occl的名称相同,因此使用下一个top元素。

    当特定元素上方或下方没有行时,我还需要注意。

    我尝试编写R代码如下:

    data <- read.delim("data.dat", header=TRUE)
    data <- data[order(data$V8, data$V7, data$V1)]
    for (i in data.sorted){
      if (data$V10 > 0 & data$V1 == data$V5 & data$V4 == data$V8){
          if (i!=i-1 |  i!=i+1){
            data$V9 =  data["Between_",i-1,"_", i+1]
            data$V1 == data$V5
          }
      }
    
    }
    write.table(data, "results.xls", "sep=\t")
    

    M15的预期输出:

    M15 SMP 3100015 3100015 -   SMP 3100255 3100552 -   Between_umn_zyc 240
    

    有人可以帮助改善我的不良尝试。感谢

1 个答案:

答案 0 :(得分:1)

我认为你在排序中错过了一个逗号:

data <- data[order(data$V8, data$V7, data$V1) , ]

如果我理解您的问题,您需要为V9的每个元素找到紧接在V9之前的不同值。这应该给你这个价值:

V9 <- data$V9
sameAsPredecessor <- V9[-length(V9)] == V9[-1]
indexOfDifferent <- cumsum(!sameAsPredecessor)
predecessor <- V9[c(NA, indexOfDifferent)]

我在开头添加NA,作为处理边缘案例的方式

你可以同样地在另一个方向受到约束:

V9 <- rev(data$V9)
sameAsPredecessor <- V9[-length(V9)] == V9[-1]
indexOfDifferent <- cumsum(!sameAsPredecessor)
follower <- rev(V9[c(NA, indexOfDifferent)])

所以你现在有了两个向量predecessorfollower,你可以将它们插入到相关的行中 - 这就是:

ind <- data$V10 > 0 & data$V1 == data$V5 & data$V4 == data$V8
data$V9[ind] <- sprintf("Between_%s_%s", predecessor[ind], follower[ind])

你不应该需要任何循环