У меня есть дата-фрейм, включающий лабораторные результаты по отдельным предметам.У некоторых субъектов есть повторяющиеся записи, только у дубликатов есть определенные точки данных, отсутствующие в одной записи, но не в другой.
Я пытаюсь написать функцию, которая будет «заполнять» данные NAточки в одной строке от любого дубликата, который может существовать для этого предмета.Вот что я попробовал:
# example data with duplicate IDs, some with missing values
ir<-head(iris)
ir$unique_flower_ID<-1:6
ir<-rbind(ir, ir[c(1,3,5),])
ir[7:9, c(1,3)]<-NA
ir[c(1,3,5), c(2,4)]<-NA
ir<-ir[order(ir$unique_flower_ID),]
# function to run on a given dataframe (df) to
# replace missing values in certain variables (vars) from duplicates
# as identified by a unique ID
replaceNAs_dupl <- function(df, ID, vars) {
#identify duplicate IDs and subset the dataframe
df_dupl<-data.frame(table(df[, ID]))
df_dupl<-df[df[, ID] %in% df_dupl$Var1[which(df_dupl$Freq > 1)],]
# loop through specified columns
for(i in vars) {
#create a mini-dataframe of ID and value for each column
df_dupl_uni<-unique(df_dupl[which(!is.na(df_dupl[,i])), c(ID, i)])
# replace missing data with data from duplicate record
df[which(df[, ID] %in% df_dupl_uni[, ID]), i] <- df_dupl_uni[match(df[which(df[, ID] %in% df_dupl_uni[, ID]), ID], df_dupl_uni[, ID]), i]
return(df)
}
}
# define the columns to run the function on by name
col_names<-colnames(ir[,1:4])
# pass ir to the function
ir2<-replaceNAs_dupl(ir, "unique_flower_ID", col_names)
Вывод работает, но только для первого столбца;цикл просто не зациклится.
Может кто-нибудь объяснить, что я делаю неправильно?
Есть ли лучший способ полностьюделать то, что я пытаюсь?