R:如何复制一列,以便如果原始列"TRUE"在第 x 行中,副本将在第 x-250 行到 x+250 中"TRUE"?



我希望这个问题能提清楚!我看过很多关于循环和if_else子句等的指南,但都没能弄清楚。

我试图在一大组txt文件中找到出现了大量(比如5个(关键字的段落。示例关键字是";"运动";以及";原因";。我的数据是整洁的(txt文件已经被拆分,每行只有一个单词(,并且使用正则表达式我添加了列(每个关键字一个(,这些列表示";TRUE";如果该行包含关键字,则为false,否则为false。现在,为了找到感兴趣的段落,我想复制每个专栏,上面写着";TRUE";在相同的行中,但也在这些行之上和之下的250行中。例如,我想复制写着";TRUE";当该行包含单词"时;"运动";,使得在新的列中,围绕单词"的500个单词;"运动";也是";TRUE";(即单词所在行的上下250行(。这个想法是,我可以很容易地检查是否有任何行中所有复制的列都是真的,这表明有一段500字的文章中出现了我的所有关键字。

我尝试过以各种方式学习和使用循环来制作这些复制的列,但到目前为止我还没有取得任何成功。这就是我最近的尝试,但它似乎只是将相同的行指定为";TRUE";250次;TRUE";。(它还给出了错误消息"'mutate(('输入'copied_column'有问题。下标越界i输入'copied_column'是'case_when(…('。(

n <-1
corpus <- corpus #>#
mutate(copied_column = case_when(
str_detect(original_column, "TRUE") ~ (repeat{
n <- n+1
str_detect(orginal_column, "FALSE")
if (n == 250) {
break
}
})
))

如果有人有任何建议,我们将非常欢迎。如果你知道我可能应该使用的任何函数,或者如果你知道如何正确使用上面例子中的函数,那将对我有很大帮助。

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

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]]
}

测试

组成一些数据并以三种不同的方式运行函数,其中两种方式在magrittr管道中。

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))

编辑

对于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

相关内容

最新更新