Я думаю, что проблема здесь:
sample(1:ncol(df1), 0.5*ncol(df1))
Если вы передаете нецелочисленные значения в параметр размера выборки, часть после комы, кажется, обрезается (с полами).
try
length(sample(1:3, 1,2)) # result: 1
length(sample(1:3, 1.4)) # result: 1
length(sample(1:3, 1.6)) # result: 1
length(sample(1:3, 1.8)) # result: 1
length(sample(1:3, 2.99)) # result: 2
, поэтому
0.5*ncol(df1)
будет недооценивать правило 50% всех столбцов, поскольку в случае неравномерного NCOL число выборочных элементов теряется.
Вы можете попробовать это как простой обходной путь:
df_test = data.frame(A = 1:5, B = 1:5, C = 1:5)
df_test
selecter = sample(c(TRUE, FALSE), NCOL(df_test), replace = T)
factor = 2
df_test[selecter] = df_test[selecter] * factor
Вместо выбора 50% всех колов, этот подход выбирает каждый отдельный столбец с вероятностью 50% (что нав долгосрочной перспективе должен подходить довольно близко).Недостаток этого метода заключается в том, что вы можете иметь прогоны со всеми выбранными столбцами или без них.