避免在R中的大型数据集上使用循环,而在重复数据上添加第二个循环

我正在重新格式化大量的水质数据,以便反馈到数据库中。当志愿者获取数据时,他们经常会使用一个水样进行多次测试,并将其记录为相同的样品编号,日期和时间。但是,数据库将不接受这一点,因此需要不同的采样时间。从历史上看,解决方案是为同一样本编号的每个后续测量增加第二个。例如,

Sample Number                DateTime
 180433               2019-11-04 12:30:00
 180433               2019-11-04 12:30:00
 180433               2019-11-04 12:30:00
 180433               2019-11-04 12:30:00
 180433               2019-11-04 12:30:00

然后我需要将时间设置为12:30:00、12:30:01、12:30:02、12:30:03、12:30:04。虽然我已经为此编写了一些代码,但它有点笨拙,而且我知道必须有一个更优雅的方法。

LIMS_dup<-LIMS_data[duplicated(LIMS_data[,c(4,8:9)]),8:9)]

x<-NA
for (i in 1:length(unique(LIMS_dup$CustomerSampleNumber))){
  x<-which(as.integer(LIMS_data$CustomerSampleNumber)==as.integer(unique(LIMS_dup$CustomerSampleNumber)[i]))
  if (length(x)>1){
    for (j in 2:length(x)){
      LIMS_data$CollectTime[x[j]]<-LIMS_data$CollectTime[x[j-1]]+1
    }
  }
}

其中LIMS_data是我的主要小标题,而LIMS_dup是重复的样本编号和时间的小标题。确实可以,但是有点慢。我希望找到一种更好的方法,尤其是一种不依赖嵌套循环的方法。

h286700143game 回答:避免在R中的大型数据集上使用循环,而在重复数据上添加第二个循环

考虑ave按组顺序计数(此处为样本编号),以将其添加到POSIXct日期时间类型(即增加秒数)中:

df$New_DateTime <- with(df,DateTime + (ave(as.numeric(DateTime),Sample_Number,FUN=seq_along)-1))

df
#   Sample_Number            DateTime        New_DateTime
# 1        180433 2019-11-04 12:30:00 2019-11-04 12:30:00
# 2        180433 2019-11-04 12:30:00 2019-11-04 12:30:01
# 3        180433 2019-11-04 12:30:00 2019-11-04 12:30:02
# 4        180433 2019-11-04 12:30:00 2019-11-04 12:30:03
# 5        180433 2019-11-04 12:30:00 2019-11-04 12:30:04

Online Demo

本文链接:https://www.f2er.com/3164455.html

大家都在问