我有以下 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))
我現在已經尋找了幾天的解決方案,但我找不到任何完全適合我的問題的東西。有任何想法嗎?
uj5u.com熱心網友回復:
資料表方法...
首先,獲取長度>=2的組的值,然后通過last-observation-carried-forward填充缺失值(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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/352902.html
