我正在尝试根据特定列的 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/