我對R相對較新,並且努力在R中「矢量化」所有代碼。儘管我很欣賞這是正確的方法。將觀察值設置爲R中該觀察值的最小值
我需要在數據框中設置一個值作爲ID的最小時間。以下作品完美
ID isTrue RealTime MinTime
1 TRUE 16 10
1 FALSE 8
1 TRUE 10 10
2 TRUE 7 7
2 TRUE 30 7
3 FALSE 3
:
ID isTrue RealTime MinTime
1 TRUE 16
1 FALSE 8
1 TRUE 10
2 TRUE 7
2 TRUE 30
3 FALSE 3
要變成。然而,這需要10分鐘跑,這是不理想的:
for (i in 1:nrow(df)){
if (df[i,'isTrue']) {
prevTime <- sqldf(paste('Select min(MinTime) from dfStageIV where ID =',df[i,'ID'],sep=" "))[1,1]
if (is.na(prevTime) | is.na(df[i,'MinTime']) | df[i,'MinTime'] < prevTime){
df[i,'MinTime']<-dfStageIV[i,'RealTime']
} else {
dfStageIV[i,'MinTime']<-prevTime
}
}
}
我應該如何正確地做到這一點?我把它用於或做循環不是在R最好的方式。我一直在看apply()和aggregate.data.frame()函數,但不知道如何做到這一點。有人能指引我朝着正確的方向嗎?非常感激!!
看看'ave'。 – lmo
謝謝,第一次嘗試是接近。 df $ MinTime <-ave(df $ RealTime,df $ ID,FUN = min)。但是,我怎樣才能讓它取得那些isTrue = TRUE的呢? – user2535309
df $ MinTime <-ave(df $ RealTime,df $ ID,df $ isTrue,FUN = min) df $ MinTime <-ifelse(df $ isTrue,df $ MinTime,NA)。這會返回一大堆警告,但會起作用。謝謝! – user2535309