2017-03-01 85 views
1

有條件填充丟失的數據我有一個數據幀,使得:中的R

df$v1 = c('2', '', '', '', '3', '', '4', '', '', 'OT') 

我想這個可變格式化爲一個序變量。然而,

df$v1 = as.ordered(df$v1) 

結果:

Ord.factor w/ 5 levels ""<"2"<"3"<"4"<..: 2 1 1 1 3 1 4 1 1 5 

[R讀取空單元格作爲唯一的條目,並在排序第一把它們。我想要做的是用空白單元格填充它上面的最後一個單元格的值(或者根據您的方向將其左側的值)填充以獲得值。換句話說,這個矢量實際上應該是這樣的:

df$v1 = c('2', '2', '2', '2', '3', '3', '4', '4', '4', 'OT') 

我相信這種變化將允許我根據需要,可變格式爲序。我已經嘗試了as.ordered(),as.factor(),levels = c('1','2','3','4','OT')和ordered = TRUE的每個組合。但是,R包含時不會使用「levels」或「ordered」參數; as.factor()函數在不使用「levels」或「ordered」參數的情況下不會導致序號變量;並且,as.ordered()函數會導致上述問題。因此,我相信在轉換之前填充空單元是最好的解決方案。什麼是最好的方法來做到這一點?我知道我可以使用:

df$v1 = as.ordered(sub('^$', '2', df$v1)) 

用「2」填充空單元;但是,每個單元的替換值不同。我可以這樣做:

df.a = df[1:4, ] 
df.b = df[5:6, ] 
df.c = df[7:9, ] 
df.d = df[10, ] 
df.a$v1 = as.ordered(sub('^$', '2', df.a$v1)) 
df.b$v1 = as.ordered(sub('^$', '3', df.b$v1)) 
df.c$v1 = as.ordered(sub('^$', '4', df.c$v1)) 

但是,我正在尋找一種方法來自動執行它。雖然上面的7行會產生我想在這種情況下的結果,但我還有許多其他表受到相同格式問題的困擾;並且與每個必需分區對應的行數對於每個分區是不同的。非常感謝您的幫助。

回答

1

我們可以使用na.locfzoo轉換空白("")到NA

library(zoo) 
df$v1 <- with(df, na.locf(replace(v1, v1=="", NA))) 
df$v1 
#[1] "2" "2" "2" "2" "3" "3" "4" "4" "4" "OT" 

這也可以做之後,以取代與非NA前相鄰的元件的NA元素與base R通過創建一個分組變量,然後填充它ave

with(df, ave(v1, cumsum(v1!=""), FUN = function(x) x[1])) 
#[1] "2" "2" "2" "2" "3" "3" "4" "4" "4" "OT" 
1

fill如何從tidyr包裝?

library(tidyr) 

df$v1 <- ifelse(df$v1 == '', NA, df$v1) # requires NA not empty string 
df <- df %>% fill(v1)