2016-10-19 11 views
3

のみNAが利用できない限り、NAはない最新のデータを保管してください:このようになります。今年、都市、値:R - 私は3列のデータセット持って

year = c(2010, 2013, 2010, 2013, 2013) 
city = c("Berlin","Berlin", "Munich", "Munich", "Frankfurt") 
value = c(1234, NA, NA, 6372, NA) 
data <- data.frame(year, value1, value2) 

year city value 
1 2010 Berlin 1234 
2 2013 Berlin  NA 
3 2010 Munich  NA 
4 2013 Munich 6372 
5 2013 Frankfurt  NA 

を私はサブセットする方法を知りたいですように、これは私が最後に私はこのようなデータが残っていますように、利用可能であるだけで、最新のデータを保持する:私は最高の年にサブセット場合

year city value 
1 2010 Berlin 1234 
2 2013 Munich 6372 
3 2013 Frankfurt  NA 

、私はその年のためにそこにISNのNAを取得データ。 !is.na()にサブセットを設定した場合、のみが使用可能なすべての行が失われます。

具体的に何をしたいのですか?その都市のNAのみが存在し、NAが最も高い年でない限り、特定の都市のデータで最も高い年が得られます。それについてどうすればいいのですか?

+0

何丁度あなたがサブセットたいですか?あなたの例から、あなたは最高年のサブセットを望んでいないようですが、ここに表示されない別の変数がありますか? –

+0

ああ、いいえ:都市の列をサブセット化したいと思います。特定の都市のデータがある最も高い年です(その都市のNAのみが存在し、NAが最も高い年)。 それが明確になりますか? – LukasKawerau

答えて

3

data.tableを使用できます。 orderのインデックス、ifの '年'として 'city'でグループ分けされた 'data.frame'を 'data.table'(setDT(data))に変換します。any非NA '値'最初の非NA '値'のインデックスに基づいて 'Data.table'をサブセット化するか、else Data.tableのサブセットを返します。

library(data.table) 
setDT(data)[order(-year), if(any(!is.na(value))) 
      .SD[which(!is.na(value))[1L]] else .SD, by = city] 

それとも我々はwhich.max

setDT(data)[order(-year), .SD[which.max(!is.na(value))], by = city] 

それともそれは速く

setDT(data)[data[order(-year), .I[which.max(!is.na(value))], by = city]$V1] 
+0

これは本当に素晴らしいです、ありがとう!私の実際のデータセットで試してみましたが、それは完璧に機能しました:) 1つの質問:NAのある都市(それは2010年、フランクフルト、NA、2011年、フランクフルト、NA、2013年、フランクフルト、NA)これらの年。その場合、どうすれば最新の年だけを保つことができますか? – LukasKawerau

+5

または 'setDT(data)[order(-year)、.SD [which isna(value)]]、by = city]' –

+0

@DavidArenburgそれはとても良かったです。実際、私は 'と'似たような試みをしていました。それで、それに焦点を当てることはできませんでした – akrun

1

Aより冗長にするために.Iを使用して変更を使用するからインデックスを取得@デビッドArenburgすることにより、コンパクトオプション、ラウンドアバウトアプローチdplyrを使用してください。また、NAの複数年のあなたの場合にも役立ちます。

library(dplyr) 
data %>% 
    group_by(city) %>% 
    mutate(all_na = all(is.na(value)), 
     remove = ifelse(all_na, 
         year != max(year), 
         is.na(value))) %>% 
    ungroup() %>% 
    filter(!remove) %>% 
    select(-all_na, -remove) 
0

max_pos(x)xの最後の非NA要素のx位置を返すか、全く非NA要素が存在しない場合にはxの最後の位置を返します。 is_maxは、最大位置ではTRUE、それ以外ではFALSEの論理を返します。 aveはその結果を最初の引数の型に強制するので、!!を使用して論理値に戻します。最後に、これらの要素をサブセット化します。これは、質問がそうであるように入力が都市内の年ごとにソートされていることを前提としています。 max_posはこれらの事実を用いて小型化したこと

seq_along(x) * 0*x

    0*x
  • はゼロのベクトルであり、NASは、それがseq_along(x)の対応する要素をNAS加えます。つまり、代わりにreplace(seq_along(x), is.na(x), NA)と同じ結果が得られます。
  • which.maxは、xがすべてNA値であり、c(arg1, arg2)[1]であれば、その結果としてif (length(arg1) == 0) arg2 else arg1と同じ結果が得られます。

パッケージは使用されません。

max_pos <- function(x) c(which.max(seq_along(x) + 0*x), length(x))[1] 
is_max <- function(x) seq_along(x) == max_pos(x) 
subset(data, !!ave(value, city, FUN = is_max)) 

与える:

year  city value 
1 2010 Berlin 1234 
4 2013 Munich 6372 
5 2013 Frankfurt NA 
関連する問題