Вы можете сделать следующее, используя data.table
.
Во-первых, я определяю функцию, которая применяется к числовому вектору, посредством чего она выводит соответствующую позицию элементов по отношению к медиане вектора:
med_fn = function(x){
med = median(x)
unlist(sapply(x, function(x){
if(x > med) {'Above'}
else if(x < med) {'Below'}
else {'At'}
}))
}
> med_fn(c(1,2,3))
[1] "Below" "At" "Above"
Давайте рассмотрим некоторые примеры данных:
dt = data.table(
C1 = c(1, 2, 3),
C2 = c(2, 1, 3),
C3 = c(3, 2, 1)
)
old = c('C1', 'C2', 'C3') # Name of columns I want to perform operation on
new = paste0(old, '_medfn') # Name of new columns following operation
Используя аргументы .SD
и .SDcols
из data.table
, я применяю med_fn
к столбцам old
,в моем случае столбцы C1
, C2
и C3
. Я называю новые столбцы C#_medfn
:
dt[, (new) := lapply(.SD, med_fn), .SDcols = old]
Результат:
> dt
C1 C2 C3 C1_medfn C2_medfn C3_medfn
1: 1 2 3 Below At Above
2: 2 1 2 At Below At
3: 3 3 1 Above Above Below