洗牌data.frame后仅删除零行

洗牌data.frame后仅删除零行,r,R,我尝试了几次用替换的data.frame重新采样。该数据框是一个逐物种的矩阵。此数据中有几个零,这意味着重采样过程有时只生成零行。因此,我想消除每个for循环中只有零行的矩阵,因为函数multipart vegan包不接受这些矩阵 提前谢谢大家 require(vegan) # DATA (Edited) dat <- read.table("df.stack.txt", h=T) # Link above mat <- dat[,c(-1, -2, -3)] levels &l

我尝试了几次用替换的data.frame重新采样。该数据框是一个逐物种的矩阵。此数据中有几个零,这意味着重采样过程有时只生成零行。因此,我想消除每个for循环中只有零行的矩阵,因为函数multipart vegan包不接受这些矩阵

提前谢谢大家

require(vegan)

# DATA (Edited)

dat <- read.table("df.stack.txt", h=T) # Link above
mat <- dat[,c(-1, -2, -3)]
levels <- dat[,1:3]

## Vectors for saving desired statistics
alfa.null <- NULL
beta1.null <- NULL
beta2.null <- NULL

## Shuffling matrices ## Here is the problem

times <- 99
for (i in times) {
mat.rand <- sample(mat, replace=TRUE) ### Problem to be solved - some matrices will have only zero rows 
div.aleat <- multipart(mat.rand ~ ., levels, index="renyi", scales=1, nsimul=99, global=TRUE)
alfa.null[i] <- div.aleat$statistic[[1]]
beta1.null[i] <- div.aleat$statistic[[4]]
beta2.null[i] <- div.aleat$statistic[[5]]
}

在得到非零矩阵之前,您需要继续重新采样,如下所示:

times <- 99
for (i in seq.int(times)) {
    while(TRUE){
        mat.rand <- sample(df, replace=TRUE) ### Problem to be solved - some matrices will have only zero rows 
        if(any(rowSums(mat.rand)!=0))
            break
    }

    blah blah blah
}

如果您的矩阵名为mat,您可以执行mat[applymat,1,functionx{!allx==0},],谢谢@eipi10。但我不能删除任何行。实际上,每当一个随机矩阵只有零行时,我需要启动另一个循环。因此,当我运行rowSumsmat.rand>0时,创建的99个矩阵必须只有真值。我认为问题在于,如果有任何行都将为零,multipart将引发该错误。要仅从非零行进行采样,可以在原始代码中将sampledf,replace=TRUE替换为sampledf[rowSumsmat.rand!=0,],size=nrowdf,replace=TRUE。如果希望原始尺寸为sameThank you@Jthorpe,则size=nrowdf是可选的。我相信,伊法尼马特·兰德=0应为ifanyrowSumsmat.rand=0,因为多部分的问题是站点是没有物种的行,只有零。我更新了代码以反映您的建议。顺便说一句,我没有函数切割器,所以我无法运行您的完整示例…不幸的是,它不起作用。当某些行中的rowSums==0时,代码似乎没有停止。我已经在正文中上传了我的数据链接,以删除cutter`功能。我相信您现在可以完全运行此示例
times <- 99
max_Tries <- 100
for (i in seq.int(times)) {
    tries = 0
    while(TRUE){
        mat.rand <- sample(df, replace=TRUE) ### Problem to be solved - some matrices will have only zero rows 
        if(any(rowSums(mat.rand)!=0))
            break
        tries <- tries + 1
        if(tries > max_Tries)
            stop("number of tries exceeded max_Tries: possible infinite loop")
    }

    blah blah blah
}