Умножение фиксированного числа случайным образом в% от столбцов в одном кадре данных - PullRequest
1 голос
/ 06 апреля 2019

Я хочу умножить фиксированное число случайным образом на 50% столбцов в моем фрейме данных и оставить остальные без изменений.

мой код содержит до 50% данных случайным образом.

Я использовал:

head(df1)


 V1       V2        V3

1 0.034935 0.034935 -0.006482

2 0.034935 0.043194  0.012351

3 0.043194 0.043194  0.012351

 df2<- df1[,sample(1:ncol(df1), 0.5*ncol(df1))]

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Я думаю, что проблема здесь:

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% (что нав долгосрочной перспективе должен подходить довольно близко).Недостаток этого метода заключается в том, что вы можете иметь прогоны со всеми выбранными столбцами или без них.

1 голос
/ 06 апреля 2019

Попробуйте

df1 <- iris[1:3, 1:4]
df1
#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#1          5.1         3.5          1.4         0.2
#2          4.9         3.0          1.4         0.2
#3          4.7         3.2          1.3         0.2

Образец из столбцов - не забудьте установить начальное значение

set.seed(42)
cols <- sample(1:ncol(df1), 0.5*ncol(df1)) # columns to multiply
other_cols <- setdiff(1:ncol(df1), cols)   # other columns

Выполните умножение и объедините результат со столбцами, которые не были умножены

number <- 2
df2 <- cbind(df1[cols] * number,
             df1[other_cols])[names(df1)]

Часть [names(df1)] в конце размещает столбцы df2 в исходном порядке.

Результат

df2
#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#1          5.1         3.5          2.8         0.4
#2          4.9         3.0          2.8         0.4
#3          4.7         3.2          2.6         0.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...