2017-05-18 58 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)