2017-05-18 69 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(value = na.locf(value))'似乎可以工作,無論你在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,身份證,價值, na.last = T)。排序再次

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

然後: 最後,你可以替換NA的

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)