当前位置: 首页 > 知识库问答 >
问题:

R:如何复制列,以便如果原始行x中的“TRUE”,则复制行x-250到x 250中的“TRUE”?

张晨朗
2023-03-14

我希望这个问题提清楚!我已经看过很多关于循环和if\u else子句等的指南,但还没有找到答案。

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

我曾尝试学习并以各种方式使用循环来制作这些复制的列,但到目前为止,我还没有取得任何成功。这就是我最近的尝试,但它似乎只是将相同的行指定为“TRUE”250次,而不是将接下来的250行指定为“TRUE”。(它还发出错误消息“Problem with'mutate()'input'copied\u column”。subscript out of bound i input'copied\u column'是'case\u 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
        }
       })
    ))

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

共有1个答案

仲孙向明
2023-03-14

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

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

生成一些数据并以3种不同的方式运行函数,其中两种方式在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
 类似资料:
  • 问题内容: 抱歉,是否曾经有人问过这个问题,但是我徒劳地寻找我 确切 问题的答案。基本上,对于Python 2.7,我有一个程序运行一系列地理处理工具,具体取决于用户在脚本中调整的一系列True / False变量所要求的内容,例如 但是,我现在发现x不必在字面上是“ True”即可运行该函数。例如: 因此,除False以外的任何值似乎都将评估为True,如果 x == True 或 x为True

  • 我有一个数据帧,其中包含这样的重复行, 0 乔 十二月 2017 1 詹姆斯 一月 2018 2 鲍勃四月 2018 3 杰克三月 2018 4 乔十二月 2017 5 杰克三月 2018 在使用df[df.duplicated(keep=False)]之后,我得到了如下输出: 0 Joe December 2017 3 Jack 2018 4 Joe Decision 2017 5 Jack 2

  • 我想从文本文件中获取以下格式: 要将其转换为没有第一行和最后一行的数据帧,我跳过了第一行和最后一行,但随后我变成了一行和onw列中的其余文本如何排列这些行?我还有一个数据框架的模式

  • 我们在桌面应用程序中大量使用flexbox,比如寻找网络应用程序,它一直运行良好。 但是在最新的火狐开发者版(35.0a2)中,布局并不像预期的那样(它会超出视口):http://tinyurl.com/k6a8jde 这在Firefox33.1中运行良好。 我认为这与此处描述的flexbox更改有关:https://developer.mozilla.org/en-US/Firefox/Rele

  • 问题内容: 我将一些代码从一个文件的一部分复制到vim的另一部分,发现每行都有行号,格式不见了,如何将正确的格式设置为原点? 像这样: 问题答案: 如果您有行号,我可以肯定您没有使用Vim的yank / put操作(这些操作将 永远不会 复制行号,foldcolumn,图标等),因为就编辑缓冲区而言,它们不存在。 我的猜测是您正在终端仿真器中工作,并使用鼠标将内容复制到剪贴板,剪贴板可能会选择屏幕