我有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)我想一切都通过一个函数来完成。
谢谢
答案 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