Пока цикл не отвечает - PullRequest
       2

Пока цикл не отвечает

0 голосов
/ 26 июня 2019

У меня есть небольшой набор данных с несколькими столбцами, как показано ниже, то, что я хотел сделать, это использовать «цикл цикла», чтобы позволить размер столбца выведите «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 Ответ

1 голос
/ 28 июня 2019

Вопрос довольно неловко сформулирован, из-за чего неясно, чего на самом деле хотят.

Но из вопроса кажется, что вы хотите сделать столбец последовательности, 1,2,3,... для каждой группы по столбцу LotID. Есть несколько способов достичь этого. Сначала я попытаюсь изменить ваш собственный код, который покажет, как можно достичь «а» решения с помощью циклов. Далее я покажу, как этого достичь, используя пакет 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 (другой - тидиверс), как показано ниже

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)

Это быстрее и удобочитаемее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...