将一个固定数随机乘以一个数据帧中列的百分比

时间:2019-04-06 08:40:54

标签: r dataframe

我想将一个固定的数字乘以我的数据框中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 个答案:

答案 0 :(得分:1)

尝试

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

答案 1 :(得分:1)

我认为问题出在这里:

sample(1:ncol(df1), 0.5*ncol(df1))

如果将非整数值传递给样本的size参数,则后面的部分 昏迷似乎已消除(泛红)。

尝试

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

此方法不是选择所有Cols的50%,而是选择每个单个col的机会为50%(从长远来看应该很接近)。 这种方法的缺点是您可以选择所有列运行,也可以不选择任何列。