R 而循环没有响应
我有一个小数据集,其中有几列,如下所示, 我想做的是使用“while循环”让size列 打印“1,2,3,4,…”,直到乳液彼此不一样 我的代码如下: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 } }
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
notj
检查相同的值,因此该值在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)