Я не уверен, что понимаю, что вы ищете ... но я думаю, что это так:
library(data.table)
setDT(df, key = 'priority')
df[.('dfA'), c('col', 'pr') := .(col.dfA, pr.dfA)]
df[.('dfB'), c('col', 'pr') := .(col.dfB, pr.dfB)]
Пропускать исходные столбцы, если это необходимо:
df[ , grep('\\.df[AB]$', names(df)) := NULL][]
# colt priority col pr
# 1: 66.99376 dfA 40.81422 22.05758
# 2: 104.97938 dfA 41.09455 19.78682
# 3: 66.33725 dfA 40.08257 21.65990
# 4: 112.25391 dfA 42.89993 19.72432
# 5: 72.14824 dfB 23.47501 30.76038
# 6: 103.57393 dfB 19.43745 26.52382
# 7: 93.28548 dfB 20.46695 29.38035
# 8: 89.28845 dfB 19.21581 28.66537
Использованиеsetcolorder
если вам важно переупорядочить столбцы.
Более программное обобщение может использовать mget
:
priorities = unique(df$priority)
nm = names(df)
merge_col = unique(c(sapply(priorities, function(suff) {
has_suff = grepl(sprintf('%s$', suff), nm)
gsub(sprintf('\\.%s$', suff), '', nm[has_suff])
})))
for (PRIORITY in priorities) {
source_cols = sprintf('%s.%s', merge_cols, PRIORITY)
df[.(PRIORITY), (merge_cols) := mget(source_cols)]
df[ , (source_cols) := NULL]
}
mget
, как известно, медленный.Может быть более эффективно использовать eval
:
df[.(PRIORITY), (merge_cols) := lapply(source_cols, function(x) eval(as.name(x)))]