我想将一个固定的数字乘以我的数据框中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))]
答案 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%(从长远来看应该很接近)。 这种方法的缺点是您可以选择所有列运行,也可以不选择任何列。