2017-06-23 69 views
1

我試圖循環訪問data.frame中的列,並將下一個有效值替換爲9(無效)對於data.frame中的每個唯一標識等於9。r - 在同一列中使用不同值替換data.frame列中的值(基於唯一ID)

我沒有運氣dplyrlapply,我一直在努力尋找類似的問題無濟於事。

#dummy data set 
id<-c(1,1,1,1,2,2,2,2) 
ind<-c(9,9,9,1,9,9,9,4) 
df<-data.frame(id,ind) 

#unique doesn't get me what I want 
#If I do (i in 1:4) it will work for the first df$id but obviously not the 2nd. 
for (i in unique(length(df$id))) 
    { 
    j=df$ind!=9 
    df$ind[i]<-df$ind[j] 
    } 

unique length(df)將無法​​正常工作,所以我基本上只適用於df$id值的子集,不能得到循環。我認爲這將工作,如果我能通過這一點。其他非循環解決方案也將受到讚賞。

+0

所以,在你的榜樣,含有9中,第一行會被設置爲1而其餘的包含9的行將被設置爲4? –

+0

是的。對於每一個唯一的'df $ id',它將取代任何值爲9的第一個值爲'df $ id',而不是9.因此,對於'df $ id == 1','df $ ind '應該都等於1,對於'df $ id == 2' ind應該都等於4. – AKP

回答

3

如果你想使用unique()你可以做這樣的事情。有可能是一個分類器的方式,但是這將做基礎R訣竅:當你說不是等於9下一個有效值

df <- lapply(unique(df$id), function(x){ 
    temp <- df[df$id == x,] 
    temp[temp$ind == 9, 'ind'] <- temp[which.max(temp$ind != 9), 'ind'] 
    temp 
}) 
do.call(rbind, df) 
+0

這是行不通的,謝謝。現在我只需要通過它,並確保我明白髮生了什麼。我將繼續致力於dplyr和循環解決方案。 – AKP

+0

如果這解決了您的問題,那麼您應該將其標記爲答案。 –

相關問題