Нужна функция R для сравнения отсутствующих значений в одном файле и обновления в другом файле - PullRequest
0 голосов
/ 25 июня 2018

У меня есть 3 CSV-файла, которые читаются как DF.

df1 - 

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

df2 содержит только код. Эти коды являются обязательными и должны присутствовать в df1. Если какой-либо код в df2 отсутствует в df1, то он должен быть добавлен в df1, а соответствующий ему столбец «Number» должен быть обновлен из df3.

dF2 - 
Code 
A
B
C
X

Здесь X из df2 отсутствует. Таким образом, он должен быть добавлен в 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 голосов
/ 25 июня 2018

Вам не понадобится цикл для выполнения этой задачи.Более быстрый способ - использовать функции слияния, как показано ниже:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...