R:如何复制一个列,以便在原始列为;“真的”;在第x行中,副本将为;“真的”;第x-250行至第x+行;250?

R:如何复制一个列,以便在原始列为;“真的”;在第x行中,副本将为;“真的”;第x-250行至第x+行;250?,r,if-statement,calculated-columns,corpus,R,If Statement,Calculated Columns,Corpus,我希望这个问题提得很清楚!我看过很多关于循环和if_else子句等的指南,但还没有弄明白这一点 我试图在大量的txt文件中查找出现大量(比如说5个)关键字的段落。示例关键字是“运动”和“原因”。 我的数据是整洁的(txt文件被分割,因此每行有一个单词),我使用正则表达式添加了列(每个关键字一个),如果行包含关键字,则列显示“TRUE”,否则列显示为false。 现在,为了找到感兴趣的段落,我想复制同一行中每一列的“TRUE”,但也要复制这些行上下的250行。例如,我想复制一个列,当该行包含单词“

我希望这个问题提得很清楚!我看过很多关于循环和if_else子句等的指南,但还没有弄明白这一点

我试图在大量的txt文件中查找出现大量(比如说5个)关键字的段落。示例关键字是“运动”和“原因”。 我的数据是整洁的(txt文件被分割,因此每行有一个单词),我使用正则表达式添加了列(每个关键字一个),如果行包含关键字,则列显示“TRUE”,否则列显示为false。 现在,为了找到感兴趣的段落,我想复制同一行中每一列的“TRUE”,但也要复制这些行上下的250行。例如,我想复制一个列,当该行包含单词“motion”时,该列显示“TRUE”,这样在新的列中,围绕单词“motion”的500个单词也都是“TRUE”(即,单词所在行上方和下方的250行)。 这样我就可以很容易地检查是否有任何行中所有复制的列都是真的,这表明有一个500字的段落中出现了我所有的关键字

我已经尝试过学习循环并以各种方式使用循环来制作这些复制的列,但到目前为止我还没有取得任何成功。这就是我最近的尝试,但它似乎只是将相同的行指定为“TRUE”250次,而不是将接下来的250行设置为“TRUE”。(它还给出了错误消息“mutate()”input“copied_column”有问题。下标超出界限i input“copied_column”是“case_when(…)”。)


n也许下面的函数可以解决这个问题。用假数据测试

segmentTRUE <- function(X, y, dist){
  f <- function(y, n, d){
    from <- max(1, y - d)
    to <- min(n, y + d)
    from:to
  }
  y <- deparse(substitute(y))
  w <- which(X[[y]])
  i <- Reduce(union, mapply(f, w, MoreArgs = list(n = nrow(X), d = dist)))
  X[i, y] <- TRUE
  X[[y]]
}

编辑 使用
nrow(df1)==1e4
,以下函数比
Reduce
版本快几个数量级

segmentTRUE2 <- function(X, y, dist){
  f <- function(y, n, d){
    max(1, y - d):min(n, y + d)
  }
  y <- deparse(substitute(y))
  w <- which(X[[y]])
  i <- unique(unlist(mapply(f, w, MoreArgs = list(n = nrow(X), d = dist))))
  X[i, y] <- TRUE
  X[[y]]
}

identical(segmentTRUE(df1, x, d), segmentTRUE2(df1, x, d))
#[1] TRUE

2非常感谢!这似乎是可行的,但是我正在使用的数据集大约有2000万行/观察值。因此,它需要很长时间才能运行。您有什么方法或技巧可以让它更快或更高效吗?@Bauke Done,请参阅新功能。
x <- rep(FALSE, 5e1)
x[c(2, 10, 35, 47)] <- TRUE
df1 <- data.frame(words = rep(letters, length.out = 5e1), x)
head(df1)
d <- 5

segmentTRUE(df1, x, d)
df1 %>% segmentTRUE(x, d)
df1 %>% mutate(x = segmentTRUE(., x, d))
segmentTRUE2 <- function(X, y, dist){
  f <- function(y, n, d){
    max(1, y - d):min(n, y + d)
  }
  y <- deparse(substitute(y))
  w <- which(X[[y]])
  i <- unique(unlist(mapply(f, w, MoreArgs = list(n = nrow(X), d = dist))))
  X[i, y] <- TRUE
  X[[y]]
}

identical(segmentTRUE(df1, x, d), segmentTRUE2(df1, x, d))
#[1] TRUE