2017-02-06 12 views
2

私は特定のデータ操作の問題に苦労しています。私は最近これを投稿し、動物園のライブラリにna.locf関数を提案しましたが、これは宿題の問題です。TAはこれを解決するために他のライブラリをロードしないように指定しました。したがって、もっと伝統的なデータ操作アプローチを使用する必要があります。 Iは、ブランク(行4~6はすべて06月21行8-9あるDATE列の値を下にドラッグする必要がR - 累積和 - ブール値ベクトルの "like"演算

my_df[1:10,1:2] 

    DATE FLIGHT 
1 May 26  NA 
2 Jun 10  NA 
3 Jun 21  NA 
4    1 
5    2 
6    3 
7 Jun 23  NA 
8    1 
9    2 
10 Jun 25  NA 

:私達は私の最初の10行を表示して、次のデータフレームを、与えられています6月23日など)。私はna.locfがこれを1つのライナーにする方法を理解しています。私はそれを使用できません。

次のように私の考えは次のとおりです。

  1. は、使用してダウンにドラッグする必要があります日付つかむ:

    repeat_dates = my_df$DATE[which(my_df$FLIGHT == 1)-1] 
    
  2. を各日付を繰り返す回数を持つベクトルを作成します。

    ["Jun 21", "Jun 21", "Jun 21", "Jun 23", "Jun 23", ...] 
    
    :3のベクトルを取得するなど、ダウン2行6月23日をドラッグするために3列、2ダウン6月21日にドラッグすることに

    repeat_count = [3, 2, ...] 
    
  3. 使用rep.int(repeat_dates、REPEAT_COUNT)に対応します

  4. 、その後値

私はこれは、私が問題を取得することができます得ることができる場合、パート2を行う方法を確認していないを更新。私のTAは、cumsum()関数を使って、ブール値のベクトル(DATEが空白の1/0になる可能性があります)を提案しました。私はこれで苦労している、どんな助けもありがとう!

EDIT - 私はリンク内の溶液と一緒に行きました

dput(my_df[1:20,1:2]) 
structure(list(DATE = structure(c(-23961, -23946, -23935, NA, 
NA, NA, -23933, NA, NA, -23931, -23911, -23893, NA, NA, -23891, 
NA, NA, -23890, NA, NA), class = "Date"), FLIGHT = c(NA, NA, 
NA, 1L, 2L, 3L, NA, 1L, 2L, NA, NA, NA, 1L, 2L, NA, 1L, 2L, NA, 
1L, 2L)), .Names = c("DATE", "FLIGHT"), row.names = c(NA, 20L 
), class = "data.frame") 
+0

forループとifステートメントは、日付が空の場合にのみ使用して前の値に置き換えることができます。 – tatxif

+1

http://stackoverflow.com/questions/7735647/replacing-nas-with-latest-non-na-value – HubertL

+1

[NAsを最新の非NA値に置き換える]の可能な複製(http:// stackoverflow .com/questions/7735647/replaced-nas-latest-non-na-value) – HubertL

答えて

0

を助けるために再現可能共有:私は私のクラスにTAによって示唆したアプローチであると考えてい

replace_na_with_last<-function(x,a=!is.na(x)){ 
    x[which(a)[c(1,1:sum(a))][cumsum(a)+1]] 
} 

この最初の混乱にもかかわらず、十分に機能して、索引付けが進行中であることを理解する必要があります。

1
for(i in 1:length(my_df$DATE)){ 
    if(my_df$DATE[i]==""){ 
    my_df$DATE[i] <- my_df$DATE[i-1] 
    } 
} 
+0

ええ、これは私のアプローチよりもずっと簡単な仕事です – Canovice