我的数据框如下:
未分类的数据:
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
我的目标是对排序数据执行以下操作:
示例“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
有人可以帮助改善我的不良尝试。感谢
答案 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)])
所以你现在有了两个向量predecessor
和follower
,你可以将它们插入到相关的行中 - 这就是:
ind <- data$V10 > 0 & data$V1 == data$V5 & data$V4 == data$V8
data$V9[ind] <- sprintf("Between_%s_%s", predecessor[ind], follower[ind])
你不应该需要任何循环