有条件地将值分配给向量的随机子集

Jua*_*n C 0 r

我想为满足某些条件的向量子集的随机样本分配一个定义的值(比方说1)。我似乎无法使其工作。

我已经试过这段代码:

a <- c(1:50)
df <- as.data.frame(a)
df$c <- 0 
df$c[sample(x=(df$c[df$a>25]), size = round(NROW(df$c[df$a>25])/5), replace = F)] <- 1
Run Code Online (Sandbox Code Playgroud)

我只想随机地将某些df$c向量值设为1,恰好是df$c其中df$aa的值大于25的五分之一值的随机样本(将5个观测值切换为1)。

但是到目前为止,它们都保持为0:/

谢谢!

Shr*_*ree 5

这是使用基数R的方法-

df$c[sample(which(df$a > 25), sum(df$a > 25)/5)] <- 1
Run Code Online (Sandbox Code Playgroud)

请注意,如果中只有1个值,则此操作将失败df$a > 25

下面的方法在任何情况下都不会失败,但是有点冗长。根据df$a-中的期望值,随意使用最适合您需要的东西

df$c[which(df$a > 25)[sample(length(which(df$a > 25)), sum(df$a > 25)/5)]] <- 1
Run Code Online (Sandbox Code Playgroud)

另外,请注意,由于relace = F,样本size = sum(df$a > 25)/5必须为<= length(which(df$a > 25))。如果要使其更加安全,可以在代码中包括此条件。

此外,如果没有更改,sum(df$a > 25)/5 < 1那么size = max(sum(df$a > 25)/5, 1)如果您至少要进行1次更改,则可能要使用。

感谢@Frank,这是我的第一个版本的更好版本-

df$c <- replace(df$c, sample(w <- which(df$a > 25), length(w)*.2), 1)
Run Code Online (Sandbox Code Playgroud)

  • 另一种方式:`replace(df $ c,sample(w &lt;-which(df $ a&gt; 25),length(w)*。2),1)` (2认同)