需要使用R函数来比较一个文件中的缺失值并更新另一个文件中的

时间:2018-06-25 15:06:36

标签: r function dataframe

我有3个csv文件,这些文件读为df。

df1 - 

Code Number 
A     12
B     13
C     14 
D     15
E     16
F     17
G     18

df2仅包含代码。这些代码是强制性代码,必须存在于df1中。如果df1中缺少df2中的任何代码,则应将其添加到df1中,并应从df3中更新其相应的“ Number”列。

dF2 - 
Code 
A
B
C
X

此处缺少df2中的X。因此,应将其添加到df1中,并从df3中提取其编号。

df3
Code Number 
A     22
B     34
C     56 
D     78
X     99
Y     100

输出-

df1 - 

Code Number 
A     12
B     13
C     14 
D     15
E     16
F     17
G     18
X     99

我有满足要求的代码。

但是我希望通过函数来​​完成所有事情。

我的函数应执行以下操作-

If any code present in df2 is missing in df1 then
{
i) get that code from df2
ii) get the number for that code from df3

iii) append that code and number to df1.

} else {
  df1<-df1 

}

下面是我的代码,可以正常工作。

df4<-merge(df2, df1, by = "code", all = T)

library(dplyr)

df5<-df4 %>%
  left_join(df3, by = c("code")) %>%
  mutate(count = ifelse(is.na(count.x), count.y, count.x)) %>%
  select(-c(count.x, count.y))

df1<-df5

上面的代码有问题-

1)即使没有丢失代码,它也会每次都更新df1。很好,但我认为可以改进。如果df1中没有缺少df2中的任何代码,我不希望代码更新df1。 2)我想一切都通过一个函数来完成。

谢谢

1 个答案:

答案 0 :(得分:0)

您不需要循环即可完成此任务。一种更快的方法是使用如下所示的合并功能:

# sample data
df1 <- data.table(code=c('A','B','C'), Number=c(10,20,30))
df2 <- data.table(code =  c('A','B','X'))
df3 <- data.table(code=c('A','X','C'), Number=c(10,200,30))

# join df1 and df2 - full join
df_temp <- merge(df1, df2, by = "code", all = TRUE)

# join again df1 and df3 - full join
df4 <- merge(df_temp, df3, by = "code", all = TRUE)

# fill missing value

fill_values <- function(x){

  if(is.na(x['Number.x'])) return(x['Number.y'])
  else return (x['Number.x'])

}

df4$Number <- apply(df4, 1, fill_values)

# select final columns
df4 <- df4[,c('code','Number'),with=F]
print(df4)

   code Number
1:    A     10
2:    B     20
3:    C     30
4:    X    200