2017-05-18 22 views
2

一致IDに基づいてNAを記入する必要があります。しかし、このdata.frameを並べ替えることは不可能です。関連するNAがユニークIDの前(または後)に常に使用されるようにしてください。loc.na未分類のIDに基づいて欠損値を記入

私の完全ではない例を思いつくのは難しいですdata.frame私は試みたソート後のサンプルデータ。これがうまくいくと思う:

df 
id value col1 
1 NA ABC 
1 2  LMN 
2 3  RGG 
2 NA Z  
3 5  H 
4 7  QRS 

が見えるように:

id value col1 
1 2  ABC 
1 2  LMN 
2 3  RGG 
2 3  Z  
3 5  H 
4 7  QRS 

またはソートに依存しないloc.naを使用する方法はありますか?

+0

行識別子を追加するだけで、na.locfなどを入力してから、並べ替えることはできませんか? – thelatemail

+0

正しい順序で行識別子を追加するにはどうすればよいですか? 「NA」が後に起こるかどうかはわかりません。私はこれをよりよく実証するために私のサンプルデータを利用しました。 –

+1

'df%>%group_by(id)%>%mutate(値= na.locf(値))' dplyrの世界に関係なく動作するようです。 – thelatemail

答えて

1
df <- read.table(header = TRUE, 
       text = "id value col1 
        1 NA ABC 
        1 2  LMN 
        2 3  RGG 
        2 NA Z  
        3 5  H 
        4 7  QRS 
") 

まず、パッケージdata.tableと、たとえば、データフレームを注文することができます:

library(data.table) 
setorder(df, id, value) 

> df 
    id value col1 
1 1 NA ABC 
2 1  2 LMN 
4 2 NA Z 
3 2  3 RGG 
5 3  5 H 
6 4  7 QRS 

をあなたはそれが後になりたい場合は、あなただけのsetorder(DF、ID、値ができました、 na.last = T)。 最後にあなたはNAの置き換えることができます。

df$value[is.na(df$value)] <- df$value[which(is.na(df$value))+1] 

をし、再びそれを並べ替える:

setorder(df, id, col1) 

> print(df, row.names = F) 
id value col1 
    1  2 ABC 
    1  2 LMN 
    2  3 RGG 
    2  3 Z 
    3  5 H 
    4  7 QRS 
+0

完璧!私は例がこれを示していないことを知っていますが、 'id'ごとに複数の' NA'値があるとどうなりますか? –

+0

@RafaelMartinsさて、別のアプローチを取る必要があると思います。 –

0

が、この作品ではないでしょうか?

matching_table <- unique(df[,c("id","value")) 
new_df <- merge(df[,-2],matching_table,all.x = TRUE) 
関連する問題