2016-11-09 6 views
3

は、私がnamesに各group最初の非欠落している名前のために、取得したいと思い、ここでは次の簡単な例Dplyr:グループで最初に見つからない文字列を見つける方法

group <-c('A','A','A','B','B','B','B') 
names<- c(NA,'fred',NA,'josh','josh',NA,NA) 
data=data_frame(group,names) 

> data 
# A tibble: 7 × 2 
    group names 
    <chr> <chr> 
1  A <NA> 
2  A fred 
3  A <NA> 
4  B josh 
5  B josh 
6  B <NA> 
7  B <NA> 

を考えてみましょう。どうやってやるの?​​3210とfirstを使用する以下の解決策は失敗します。

data %>% group_by(group) %>% mutate(first_non_missing = first(names), 
            first_non_missing_alt = coalesce(names)) %>% ungroup() 

# A tibble: 7 × 4 
    group names first_non_missing first_non_missing_alt 
    <chr> <chr>    <chr>     <chr> 
1  A <NA>    <NA>     <NA> 
2  A fred    <NA>     fred 
3  A <NA>    <NA>     <NA> 
4  B josh    josh     josh 
5  B josh    josh     josh 
6  B <NA>    josh     <NA> 
7  B <NA>    josh     <NA> 

確かに、グループAため、first_non_missingは、3回のすべての観測のためのfred ..

感謝しなければなりません!

+1

期待される結果は何ですか?見つかった名前は、指定されたグループの新しい変数にすべての値を代入する必要がありますか? –

+0

はいそれはまさに普通の突然変異です。同じサイズの元のデータフレームと、各グループの '名前'に最初に欠けている文字列を繰り返す新しい列 –

+0

ありがとうございました。しかし誰かがあなたよりも速かったです:D –

答えて

8

[集計は、まずあなたはまだすべての行をしたい場合はwhich

data %>% 
    group_by(group) %>% 
    summarise(first_non_missing = names[which(!is.na(names))[1]]) 

group first_non_missing 
    <chr>    <chr> 
1  A    fred 
2  B    josh 

を与える使用して、非欠落している、mutatesummariseを置き換える見つけ、ここでグループごとに1つのエントリを、与えます。

+0

これは意味があります。ありがとう!それに、ここでうまくいかないとすれば、「合体」は何をするべきなのか分かりません。 –

+1

うれしいです。私は、 '合体 'はそれらの中ではなく、列全体で使用されるように設計されていると信じています。つまり、3つの 'name'列がある場合、各行に欠損値のない最初の列を返します。 –

+0

これまでにない最も奇妙な機能lol –

関連する問題