2012-03-01 13 views
12

每週我都會收集不完整的數據集以進行分析。看起來像:在列中添加缺少的值,並使用以上行中的值

df1 <- data.frame(var1 = c("a","","","b",""), 
      var2 = c("x","y","z","x","z")) 

某些var1值丟失。數據集應該看起來像這樣:

df2 <- data.frame(var1 = c("a","a","a","b","b"), 
      var2 = c("x","y","z","x","z")) 

目前我使用Excel宏來做到這一點。但是這使分析自動化變得更加困難。從現在開始,我想在R這麼做。但是我不知道該怎麼做。

感謝您的幫助。

問題更新後COMMENT

VAR2是不相關的我的問題。我唯一想做的就是。從df1到df2。

df1 <- data.frame(var1 = c("a","","","b","")) 
df2 <- data.frame(var1 = c("a","a","a","b","b")) 
+0

我不明白你正在使用,以替換缺失值的模式。你想用'a'替換第一組空白直到'b',然後用'b'替換空白直到'c',等等...... – John 2012-03-01 10:59:18

+0

對不起。 var2與問題無關。我會更新我的問題。 – jeroen81 2012-03-01 11:03:04

+2

我添加了tidyr包v0.3.0'fill()'。這正是我想要的。 – jeroen81 2015-09-14 10:24:14

回答

16

下面是通過使用遊程長度編碼的(rle)做的一種方式,並且其逆rle.inverse

fillTheBlanks <- function(x, missing=""){ 
    rle <- rle(as.character(x)) 
    empty <- which(rle$value==missing) 
    rle$values[empty] <- rle$value[empty-1] 
    inverse.rle(rle) 
} 

df1$var1 <- fillTheBlanks(df1$var1) 

結果:

df1 

    var1 var2 
1 a x 
2 a y 
3 a z 
4 b x 
5 b z 
+0

謝謝,這是我正在尋找的答案。 – jeroen81 2012-03-01 11:08:46

+0

非常有用,謝謝Andrie!我根據自己的需要調整了這一點,並製作了一個怪物(可能很危險),但要記錄下來:https://pastebin.com/82kvNp1D – PatrickT 2017-10-31 21:18:59

10

這裏是一個更簡單的方式:

library(zoo) 
df1$var1[df1$var1 == ""] <- NA 
df1$var1 <- na.locf(df1$var1) 
+0

+1必須。得到。熟悉。有了。動物園。 – Andrie 2012-03-01 17:48:28

2

這裏是另一種方式是略短,不強制字符:

Fill <- function(x,missing="") 
{ 
    Log <- x != missing 
    y <- x[Log] 
    y[cumsum(Log)] 
} 

結果:

# For factor: 
Fill(df1$var1) 
[1] a a a b b 
Levels: a b 

# For character: 
Fill(as.character(df1$var1)) 
[1] "a" "a" "a" "b" "b" 
+0

+1不錯的一個.... – Andrie 2012-03-01 17:49:25