r-将data.frame列中的值替换为同一列中基于唯一ID的不同值

r-将data.frame列中的值替换为同一列中基于唯一ID的不同值,r,R,我正在尝试循环遍历data.frame中的一列,并用data.frame中每个唯一id的下一个不等于9的有效值替换9(无效) 我在dplyr,lappy方面运气不好,我一直在努力寻找类似的问题,但都无济于事 #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

我正在尝试循环遍历data.frame中的一列,并用data.frame中每个唯一id的下一个不等于9的有效值替换9(无效)

我在
dplyr
lappy
方面运气不好,我一直在努力寻找类似的问题,但都无济于事

#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]
  }
#虚拟数据集

id如果你想使用
unique()
你可以这样做。可能有一种更高级的方法,但这将在base R中实现这一点:

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)

df因此,在您的示例中,当您说下一个有效值不等于9时,包含9的第一行将设置为1,包含9的其余行将设置为4?是。对于每个唯一的
df$id
,它将用不是9的
df$id
的第一个值替换任何9的值。因此,对于
df$id==1
来说,
df$ind
应该都等于1,对于
df$id==2
ind应该都等于4。这确实有效,谢谢。现在我只需要仔细检查一下,确保我明白发生了什么。我将继续研究dplyr和循环解决方案。如果这解决了您的问题,那么您应该将其标记为答案。