Создать новый столбец, если значение находится в пределах диапазона окна в том же столбце и в том же кадре данных - PullRequest
1 голос
/ 14 апреля 2020

У меня есть фрейм данных 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.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Сначала упорядочите данные по POS и определите, являются ли абсолютные значения POS - lag(POS) и POS - lead(POS) меньшими или равными 3.

library(dplyr)

tmp %>%
  arrange(POS) %>%
  mutate(exist3 = (exist == 1 &
         abs(POS - lag(POS)) <= 3 &
         abs(POS - lead(POS)) <= 3) * 3)

#    CHROM     POS exist exist3
# 1      1 1014179     0      0
# 2      1 1014182     0      0
# 3      1 1014217     0      0
# 4      1 1014227     0      0
# 5      1 1014228     1      3
# 6      1 1014229     0      0
# 7      1 1014231     0      0
# 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
1 голос
/ 14 апреля 2020

Я не совсем уверен, какими должны быть ваши условия. Если вам нужен индекс (exist3), который указывает, является ли ваш POS существующим1 = 1 или +/- 3 вокруг них, то это должно работать:

tmp$exist3 <- apply(tmp, 1, function(x) ifelse(x[3]==1 | x[2]%in%c(sapply(c(tmp$POS[tmp$exist]), function(y) y + seq(-3,3))), 3, 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...