我刚刚开始使用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
}
}
答案 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 )