R中的Na / NaN错误

时间:2018-04-16 21:17:49

标签: r

我刚刚开始使用R并且有一个复杂的问题。所以我有一个名为“data”的数据框,每个人都被分配了一个PID号。我想做一个循环来找到最接近的两个日期(SampleDate和LTROT.Date),因为每个LTROT.Date有多个样本日期。运行此代码时,我不断收到“start.of.PID:end.of.PID:NA / NaN参数中的错误”。数据是保密的,所以我无法提供。我是stackoverflow的新手,所以如果我的问题不符合某些指导方针,我会道歉。

unique <- unique(data$PID)
z <- 1
end.of.PID <- 0
max <- 100000000
sample.ideal <- vector(length = 58)
for(i in unique){
  start.of.PID <- (end.of.PID + 1)
  multi <- sum(unique[i] == data$PID)
  end.of.PID <- (start.of.PID + multi)-1
    for(j in start.of.PID:end.of.PID){
      Sample.Date <- as.Date(data$SampleDate)
      LTROT.Date <- as.Date(data$LTROT.Date)
      time <- Sample.Date[j]-LTROT.Date[j]

      if(time < max){
        max <- time
        sample.ID <- data$SampleID[j]
      }else{
        max <- max
      }

      sample.ideal[z] <- sample.ID
      z <- z + 1
    }
}

1 个答案:

答案 0 :(得分:0)

OP代码中的错误:

unique <- unique(data$PID)
......
for(i in unique){    # i represent as an item in "unique" vector
  start.of.PID <- (end.of.PID + 1)
  multi <- sum(unique[i] == data$PID) #Here i has been used as 'index'

  #The above line should be written as:
  multi <- sum(i == data$PID)

虽然OP提供的示例数据没有提问但是基于for-loop中的逻辑,似乎基于dplyr的解决方案可能更容易。结果可以由self-join接收,然后过滤具有最小日期差异的记录。查询可以写成:

library(dplyr)

data %>% mutate(SampleDate = as.Date(SampleDate),  LTROT.Date = as.Date(LTROT.Date)) %>%
  inner_join(., .,by="PID") %>%
  group_by(PID) %>%
  mutate(MinDateDiff = (SampleDate.x - LTROT.Date.y)) %>%
  filter(MinDateDiff == min(MinDateDiff)) %>%
  select(PID, SampleDate = SampleDate.x, LTROT.Date = LTROT.Date.y, MinDateDiff )