R 而循环没有响应

R 而循环没有响应,r,R,我有一个小数据集,其中有几列,如下所示, 我想做的是使用“while循环”让size列 打印“1,2,3,4,…”,直到乳液彼此不一样 我的代码如下: for (i in nrow(Crystal.Diam.2)) { j <- 1 while (identical(Crystal.Diam.2[i,1], Crystal.Diam.2[i-1,1])==TRUE) { j <- j+1 Crystal.Diam.2[i,4]<- j } }

我有一个小数据集,其中有几列,如下所示, 我想做的是使用“while循环”让size列 打印“1,2,3,4,…”,直到乳液彼此不一样

我的代码如下:


for (i in nrow(Crystal.Diam.2)) {
  j <- 1
  while (identical(Crystal.Diam.2[i,1], Crystal.Diam.2[i-1,1])==TRUE) {
    j <- j+1
    Crystal.Diam.2[i,4]<- j
  }
}


这个问题措辞相当笨拙,不清楚到底想要什么

但是从这个问题来看,您似乎希望通过
LotID
列为每组创建序列列,
1,2,3,
。实现这一点有多种方法。首先,我将“尝试”修改您自己的代码,这将展示如何通过循环实现“a”解决方案。接下来,我将展示如何使用包实现这一点

使用循环 这是一个相当棘手的问题,大多数情况下只是跟踪事实。它可以使用一个循环和一些跟踪变量来完成。我建议将其与您自己的代码进行比较,因为我会修复一些错误并指出它们

#Initiate the group
group <- NULL
#Note the 'seq' in the for
for(i in seq(nrow(Crystal.Diam.2))){
    if(group != Crystal.Diam.2[i, 1]){
        group <- Crystal.Diam.2[i, 1]
        j <- 1
    }
    Crystal.Diam.2[i, 4] <- j
}

这更快,可读性更强。

您的while循环不会更改用于子集设置的主变量
i
。请注意,逻辑语句是基于
i
not
j
检查相同的值,因此该值在while循环期间的任何时候都不会改变。如果为真,则将保持为真,直到
i
更改。由于while循环不会影响
i
这是永远的。我很高兴。:-)但我想知道,你对这个问题有什么好的建议吗?我尝试使用“分组方式”,但没有成功。非常感谢。我已经添加了一个答案,希望能给你一个可行的建议:-)谢谢@Oliver,我早些时候解决了这个问题,但我只是用“聚合”来对乳液进行分组,这样我就知道每个乳液的样本大小是多少(因为实际上每个乳液都有不同的样本大小,我不想手动计算它)。请允许我问一下如果(group!=Crystal.Diam.2[I,1]){group我的荣幸,
if(group!=Crystal.Diam.2[I,1])…
如您所想,检查我们是否仍在计算相同的组。基本上,对于每一行,检查组是否已更改,如果已更改,则重置计数器。此命令是否有输入错误:Crystal.Diam.2[,Size:=seq(.N),by=LotID)这个问题很难回答。不,不是从我这边。我建议,如果你觉得数据表维基页面有问题,可以查看它。我的答案中第一次提到它时,它就链接到了。:-)
                        LotID Diameter SampleSize Size
    DPE.01789.P     RX1805570   14.265          1   NA
    DPE.01789.P.1   RX1805570   14.232          1   NA
    DPE.01789.P.2   RX1805570   14.224          1   NA
    DPE.01789.P.3   RX1805570   14.244          1   NA
    DPE.01789.P.4   RX1805570   14.231          1   NA
    DPE.01789.P.5   RX1805570   14.255          1   NA
    DPE.01789.P.6   RX1805570   14.248          1   NA
    DPE.01789.P.7   RX1805570   14.254          1   NA
    DPE.01789.P.8   RX1805570   14.246          1   NA
    DPE.01789.P.9   RX1805570   14.258          1   NA
    DPE.01789.P.10  RX1805570   14.261          1   NA
    DPE.01789.P.11  RX1805570   14.239          1   NA
    DPE.01789.P.12  RX1805570   14.244          1   NA
    DPE.01789.P.13  RX1805570   14.245          1   NA
    DPE.01789.P.14  RX1805570   14.264          1   NA
    DPE.01789.P.15  RX1805570   14.234          1   NA
    DPE.01789.P.16  RX1805570   14.243          1   NA
    DPE.01789.P.17  RX1805570   14.259          1   NA
    DPE.01789.P.18  RX1805570   14.253          1   NA
    DPE.01789.P.19  RX1805570   14.241          1   NA
    DPE.01789.P.20  RX1805571   14.227          1   NA
#Initiate the group
group <- NULL
#Note the 'seq' in the for
for(i in seq(nrow(Crystal.Diam.2))){
    if(group != Crystal.Diam.2[i, 1]){
        group <- Crystal.Diam.2[i, 1]
        j <- 1
    }
    Crystal.Diam.2[i, 4] <- j
}
library(data.table)
setDT(Crystal.Diam.2)
#data table syntax. .N is the row count within grouping. Size := --- adds a column or assigns a column with the values on the RHS.
Crystal.Diam.2[, Size := seq(.N), by = LotID)