r - 根据特定列上的 rep 函数在 R 中的行中查找序列

标签 r data.table


我正在尝试根据特定列的 rep 函数在一行中找到一系列 0。以下是我迄今为止最好的尝试,它会引发错误。我尝试使用 apply 循环但失败得很惨,我真的不想使用 for 循环,除非我必须这样做,因为我的真实数据集大约有 800,000 行。我曾尝试查找解决方案,但似乎找不到任何东西,并且为此花了几个小时但没有运气。我还附上了所需的输出。

library(data.table)

TEST_DF <- data.table(INDEX = c(1,2,3,4),
                      COL_1 = c(0,0,0,0),
                      COL_2 = c(0,0,2,5),
                      COL_3 = c(0,0,0,0),
                      COL_4 = c(0,2,0,1),
                      DAYS  = c(4,4,2,2))

IN_FUN <- function(x, y)
{
  x <- rle(x)

  if( max(as.numeric(x$lengths[x$values == 0])) >= y )
  {
    "Y"
  }
  else
  {
    "N"
  }
}

TEST_DF$DEFINITION <- apply(TEST_DF[, c(2:5), with = FALSE], 1, 
                            FUN = IN_FUN(TEST_DF[, c(2:5), with = FALSE], TEST_DF$DAYS))

DESIRED <- TEST_DF <- data.table(P_ID = c(1,2,3,4),
                                 COL_1 = c(0,0,0,0),
                                 COL_2 = c(0,0,2,5),
                                 COL_3 = c(0,0,0,0),
                                 COL_4 = c(0,2,0,1),
                                 DAYS  = c(4,4,2,2).
                                 DEFINITION = c("Y","N","Y","N"),
                                 INDEX = c(2,NA,4,NA)

对于第一行,我想查看 COL_1 到 COL_4 中是否有四个 0,第 2 行中是否有四个 0,第 3 行和第 4 行中是否有两个 0。基本上,0 的数量由 DAYS 列中的值给出。因此,由于第 1 行中有四个 0,DEFINITION 的值为“Y”,第 2 行的值为“N”,因为只有三个 0 第 4 行的值为“Y”,因为有两个 0,等等.

此外,如果可能,如果 DEFINITION 列中的值为“Y”,则它应该返回所需序列第一次出现的列索引,例如在第 1 行中,因为我们要查找的 4 个 0 中第一次出现的 0 在 COL_1 中,那么我们应该为 INDEX 列获得 2 的值,并且第 2 行获得 NA,因为 DEFINITION 是“N”,等等。< br/>

请随意进行任何编辑以使其他用户更清楚,如果您需要更好的信息,请告诉我。

提前干杯:)

编辑:
下面是一个稍微扩展的数据表。让我知道这是否足够。

TEST_DF <- data.table(P_ID = c(1,2,3,4,5,6,7,8,10),
                  COL_1 = c(0,0,0,0,0,0,0,5,90),
                  COL_2 = c(0,0,0,0,0,0,3,78,6),
                  COL_3 = c(0,0,0,0,0,0,7,5,0),
                  COL_4 = c(0,0,0,0,0,5,0,2,0),
                  COL_5 = c(0,0,0,0,0,7,2,0,0),
                  COL_6 = c(0,0,0,0,0,9,0,0,5),
                  COL_7 = c(0,0,0,0,0,1,0,0,6),
                  COL_8 = c(0,0,0,0,0,0,0,1,8),
                  COL_9 = c(0,0,0,0,0,1,6,1,0),
                  COL_10 = c(0,0,0,0,0,0,7,1,0),
                  COL_11 = c(0,0,0,0,0,0,8,3,0),
                  COL_12 = c(0,0,0,0,0,0,9,6,7),
                  DAYS = c(10,8,12,4,5,4,3,4,7))

其中行的 DEFINITION 列为 c(1,1,1,1,1,0,1,0,0),其中 1 是“Y”,0 是“N”。两者都可以。

对于新编辑中的 INDEX 列,值应为 c(2,2,2,2,2,NA,7,NA,NA)

最佳答案

能够通过一些数学技巧来做到这一点。我创建了一个二进制矩阵,其中如果元素最初为 0 则为 1,否则为 0。然后,对于每一行,我将行中的第 n 个元素设置为等于(第 n-1 个元素 + 第 n 个元素)乘以第 n 个元素。在这个变换后的矩阵中,一个元素的值等于之前为0的连续元素的个数(包括这个元素)。

m<-as.matrix(TEST_DF[, 2:(ncol(TEST_DF)-1L)])
m[m==1]<-2
m[m==0]<-1
m[m!=1]<-0

for(i in 2:ncol(m)){
  m[,i]=(m[,i-1]+m[,i])*m[,i]
}

# note the use of with=FALSE -- this forces ncol to be evaluated
#   outside of TEST_DF, leading the result to be used as a
#   column number instead of just evaluating to a scalar
m<-as.matrix(cbind(m, Days=TEST_DF[,ncol(TEST_DF),with=FALSE]))
indx<-apply(m[,-ncol(m)] >= m[,ncol(m)],1,function(x) match(TRUE,x) )

TEST_DF$DEFINITION<-ifelse(is.na(indx),0,1)
TEST_DF$INDEX<-indx-TEST_DF$DAYS+2

注意:我从this post偷了一些东西

关于r - 根据特定列上的 rep 函数在 R 中的行中查找序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24981998/

相关文章:

r - 执行半反连接(在二进制搜索中)

r - R中基于不等式的条件累积和

r - 更新一个 data.table 的多列

R 编程 : Using previously calculated row to update each row

r - 是否有 Rstudio 键盘快捷键来打开包含您编写的函数的源代码的文件?

javascript - 传单 map 未出现在 Rmarkdown 的选项卡式 HTML 文档输出中

r - 将参数传递给包含 dplyr 管道表达式 group_by 和 stringr::str_extract 的函数

r - 在基本层面上,eval-parse 在 R 中做什么?

r - `setDT` 包中的 `data.table` 错误

r - 如何在R中找到上一个星期日