2016-10-08 12 views
2

私はdatatableを持っています。各列は時系列を表しており、時系列ごとの最後のNA値を列順に取得します。私の特定のユースケースでは、私のデータは次のようになります。このうちのだから、data.tableの列ごとに最後の非NA行の値を取得

a b  c 
1 2  5 
1 -17 9 
NA 11 4 
NA 57 NA 
63 NA NA 

私が抽出したいと思います:

a b c 
63 57 4 

私はこれを実現するにはどうすればよいですか?これまでのところ、列ごとではなく最後の非NA行を抽出するという逆の状況に対処する答えしか見られません。

答えて

4

データセットがdata.table場合、Data.table(.SD)のサブセットをループは、非NA要素(x[!is.na(x)])のサブセットtailとのうちの最後の要素を抽出します。

df1[, lapply(.SD, function(x) tail(x[!is.na(x)],1))] 
# a b c 
#1: 63 57 4 
+2

はい。または 'apply(df1,2、function(x)x [max(which is !na(x)))])' –

+0

@akrun、これは行単位で行うことができますか?出力: '5、9、4、57、63'? (これが新しい質問に当てはまるか分かりません) –

+1

@RafaelMartinsおそらく 'do.call(pmax、c(df1、na.rm = TRUE))が必要です。 #[1] 5 9 11 57 63' – akrun

1

ベースRのみを使用したい場合。

sapply(df, function(x) x[max(which(!is.na(x)))])

df <- data.frame(a = c(1, 1, NA, NA, 63), 
       b = c(2, -17, 11, 57, NA), 
       c = c(5, 9, 4, NA, NA)) 
関連する問題