我有一个小的数据集,其中包含如下几列, 我想做的是使用“ 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
答案 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)
这更快,更易读。