2017-06-23 46 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

如果这解决了您的问题,那么您应该将其标记为答案。 –

相关问题