r-根据条件从上一组中选择值



我有以下df

df<-data.frame(value = c(1,1,1,2,1,1,2,2,1,2),
group = c(5,5,5,6,7,7,8,8,9,10),
no_rows = c(3,3,3,1,2,2,2,2,1,1))

其中相同的连续值形成一组,即,行1:3中的值属于组5。列";no_rows";告诉我们每组有多少行/条目,即第5组有3行/条目。

我正在尝试替换所有值,其中no_rows<2,具有来自前一组的值。我希望我的终端df看起来像这样:

df_end<-data.frame(value = c(1,1,1,1,1,1,2,2,2,2),
group = c(5,5,5,6,7,7,8,8,9,10),
no_rows = c(3,3,3,1,2,2,2,2,1,1))

我在for循环中想出了if…else的组合,这给了我想要的输出,但它非常慢,我正在寻找优化它的方法。

for (i in 2:length(df$group)){
if (df$no_rows[i] < 2){
df$value[i] <- df$value[i-1]
} 
}

我也尝试过dplyr::mutate和lag((,但它没有给我所需的输出(它只删除每个组的第一个值,而不是取前一个组的值(。

df<-df%>%
group_by(group) %>%
mutate(value = ifelse(no_rows < 2, lag(value), value))

几天来,我一直在寻找解决方案,但我找不到任何完全适合我问题的方法。有什么想法吗?

一种数据表方法。。。

首先,得到长度>2,然后填写最后一次观测结转的缺失值(NA(。

library(data.table)
# make it a data.table
setDT(df, key = "group")
# get values for groups of no_rows >= 2
df[no_rows >= 2, new_value := value][]
#    value group no_rows new_value
# 1:     1     5       3         1
# 2:     1     5       3         1
# 3:     1     5       3         1
# 4:     2     6       1        NA
# 5:     1     7       2         1
# 6:     1     7       2         1
# 7:     2     8       2         2
# 8:     2     8       2         2
# 9:     1     9       1        NA
#10:     2    10       1        NA
# fill down missing values in new_value
setnafill(df, "locf", cols = c("new_value"))
#    value group no_rows new_value
# 1:     1     5       3         1
# 2:     1     5       3         1
# 3:     1     5       3         1
# 4:     2     6       1         1
# 5:     1     7       2         1
# 6:     1     7       2         1
# 7:     2     8       2         2
# 8:     2     8       2         2
# 9:     1     9       1         2
#10:     2    10       1         2

相关内容

  • 没有找到相关文章

最新更新