我想为满足某些条件的向量子集的随机样本分配一个定义的值(比方说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:/
谢谢!
这是使用基数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)