R 如果值在同一列和同一数据帧的窗口范围内,则创建新列

R 如果值在同一列和同一数据帧的窗口范围内,则创建新列,r,R,我有一个数据帧tmp tmp我不太确定你的情况应该是什么。如果您需要一个索引(exist3)来指示您的POS在其周围是exist1=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)) tmp$exist3首先按POS对数据排序,并确定POS-l

我有一个数据帧
tmp


tmp我不太确定你的情况应该是什么。如果您需要一个索引(exist3)来指示您的POS在其周围是exist1=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))

tmp$exist3首先按
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
库(dplyr)
tmp%>%
排列(位置)%>%
变异(exist3=(exist==1&

abs(位置-滞后(位置))存在错误。
rep(PositionsIneed,3)
应修改为
rep(PositionsIneed,各=3)
。您的输出看起来是正确的,这仅仅是因为
PositionsIneed
有2个元素。如果它的长度不是2,
exist2
将是错误的。@DarrenTsai感谢您指出,我会更正它。不,这不是正确的答案,因为它将
3
分配给
exist2
0
的位置,就像分配给positi在
1014422
True上,如果exist1=1且POS为POS[exist1==1]的+/-3,则该值应正确且仅为3
tmp$exist3最后,我想我理解了
tmp$exist3如果这是您想要的,请忽略。如果您要将
#7 1 1014231
exist从0更改为1,这是否仍能给您所需的结果?