While循环无响应

时间:2019-06-26 20:07:02

标签: r

我有一个小的数据集,其中包含如下几列, 我想做的是使用“ while循环”让size列 打印“ 1,2,3,4,...”,直到LotID彼此不同为止。

我的代码如下:


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

之所以加上“ j”,是因为我看到了如下示例:

i =1
while(i <=10){
print(i)
i=i+1

上面的代码会给我1〜11 所以我想尝试但失败了。 任何帮助将不胜感激。 谢谢

                        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

1 个答案:

答案 0 :(得分:1)

这个问题措辞很尴尬,使得不清楚实际需要什么。

但是从这个问题来看,您似乎想在1,2,3,...列的每一组中创建LotID的序列列。有多种方法可以实现此目的。首先,我将“尝试”更改您自己的代码,这将说明如何实现带有循环的“ a”解决方案。接下来,我将展示如何使用data.table软件包来实现这一目标。

使用循环

这是相当棘手的事情,大部分只是跟踪什么是什么。可以使用一个循环和一些跟踪变量来完成。我建议将其与您自己的代码进行比较,因为我可以修复一些错误并指出这些错误。

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

j用作计数器。我使用if语句检查组是否相同,否则我重置计数器。

然而,这也可以通过许多其他方式来实现。一个是data.table(另一个是tidyverse),如下所示

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)

这更快,更易读。