2012-03-01 9 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のAFTER

QUESTIONのUPDATEは私の質問には関係ありません。私がしようとしているのは唯一のことです。 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

+0

混乱して申し訳ありません。 var2は質問にはまったく関係ありません。私は私の質問を更新します。 – jeroen81

+2

私はtidyrパッケージv0.3.0 'fill()'が追加されました。これは私が欲しかったものです。 – jeroen81

答えて

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

+0

非常に便利、感謝アンドリー!私はこれを自分のニーズに合わせ、モンスター(おそらく危険)を作りましたが、記録のために:https://pastebin.com/82kvNp1D – PatrickT

10

ここでは、Aでありますより簡単な方法:

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

+1必要があります。取得する。おなじみ。と。動物園。 – Andrie

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

関連する問題