У меня есть фрейм данных tmp
tmp <- structure(list(CHROM = c("1", "1", "1", "1", "1", "1", "1", "1",
"1", "1", "1", "1"), POS = c(1014179L, 1014182L, 1014217L, 1014227L,
1014228L, 1014229L, 1014231L, 1014276L, 1014359L, 1014401L, 1014422L,
1014451L), exist = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0)), row.names = c(NA,
12L), class = "data.frame")
PositionsIneed <- tmp$POS[which(tmp$exist %in% 1)] # <- positions of interests
pos <- c( rep(PositionsIneed, each = 3)-1:3, rep(PositionsIneed, each = 3)+1:3 ) # <- gets all +3/-3 positions
tmp$exist2 <- ifelse(
tmp$POS %in% pos [which(pos %in% tmp$POS)], # <- condition
2, # <- TRUE
0 # <- FALSE
)
tmp
# CHROM POS exist exist2
#1 1 1014179 0 0
#2 1 1014182 0 0
#3 1 1014217 0 0
#4 1 1014227 0 2
#5 1 1014228 1 0
#6 1 1014229 0 2
#7 1 1014231 0 2
#8 1 1014276 0 0
#9 1 1014359 0 0
#10 1 1014401 0 0
#11 1 1014422 1 0
#12 1 1014451 0 0
Я хотел бы создать новый столбец exist3 = 3
, только если значения около tmp$exist = 1
и tmp$exist2 = 2
такие, чтобы получить:
# CHROM POS exist exist2 exist3
#1 1 1014179 0 0 0
#2 1 1014182 0 0 0
#3 1 1014217 0 0 0
#4 1 1014227 0 2 0
#5 1 1014228 1 0 3
#6 1 1014229 0 2 0
#7 1 1014231 0 2 0
#8 1 1014276 0 0 0
#9 1 1014359 0 0 0
#10 1 1014401 0 0 0
#11 1 1014422 1 0 0
#12 1 1014451 0 0 0
Я видел этот поток , но это были два разных кадра данных. Кроме того, в отличие от этого вопроса, мои значения находятся в том же столбце около + 3 / -3 вокруг позиции интереса.
Итак, как мне создать этот новый столбец с заданными условиями?
Было бы также лучше, если бы существовал более простой способ, чем создание exist2
.
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Чтобы сделать его более понятным, я хочу получить строки, где exist = 1
и только если есть существующие значения вокруг этой позиции + 3 / -3 .
Например, POS
1014228
имеет 1014227
, 1014229
и 1014231
, который находится в окне + 3 / -3.
, тогда как POS
1014422
не имеет никакого существующего значения в диапазоне + 3 / -3.