Diese Frage könnte besser in Stack sein, da sie auf die Programmierung in R fokussiert ist, aber hier ist ein Antwort:
Ich stelle mir vor, es gibt bessere Möglichkeiten, dies zu tun, aber die, die sofort in den Sinn kommt.
replace_nas <- function(df,var,id_var,func = function(x) x[!is.na(x)])
return(merge(df[,-which(names(df)==var)],aggregate(as.formula(paste0(var,"~",id_var)),df,func))[,var])
replace_all_nas <- function(df,id_vars,select_var,agg_vars,func = function(x) x[!is.na(x)])
return(cbind(df[,id_vars],sapply(agg_vars,function(x) replace_nas(df,x,select_var,func))))
Verbrauch: rufen replace_all_nas mit df als data.frame Sie diese Aktion ausführen wollen, id_vars ist ein Vektor der Namen der Spalten, die Sie festgelegt wollen, select_var ist die Variable, die Sie durch organisieren möchten, agg_vars sind die Variablen, die die NAs von ersetzen sollen, func ist die Funktion, die Sie verwenden möchten, um Nicht-Na-Werte zu sammeln, um die NAs zu ersetzen. Ich stelle dies ein, um die nicht-NA-Werte auszuwählen, unter der Annahme, dass es nur einen gibt, aber Sie würden etwas anderes benötigen, um damit umzugehen, wenn Sie mehrere nicht-NA-Werte in einer Spalte haben.
Laufen auf Ihrem Beispiel:
replace_all_nas(blah,id_vars = c("id","month"),select_var = c("month"),agg_vars = c("price1","price2"),func = function(x) x[!is.na(x)])
# id month price1 price2
# 1 1 1 4 2
# 2 2 1 4 2
# 3 3 1 4 2
# 4 1 2 6 4
# 5 2 2 6 4
# 6 3 2 6 4
Danke, ich werde auch mit diesem experimentieren! –