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

时间:2019-06-18 17:12:44

标签: 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

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

但是到目前为止,所有这些都保持为0:/

谢谢!

2 个答案:

答案 0 :(得分:5)

这是一个以R为底的方式-

df$c[sample(which(df$a > 25), sum(df$a > 25)/5)] <- 1

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

下面的方法在任何情况下都不会失败,但是有点冗长。随时根据df$a-

中的期望值使用最适合您需要的内容
df$c[which(df$a > 25)[sample(length(which(df$a > 25)), sum(df$a > 25)/5)]] <- 1

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

此外,如果sum(df$a > 25)/5 < 1也不会发生变化,因此如果您至少要进行1次更改,则可能要使用size = max(sum(df$a > 25)/5, 1)

由于@Frank,这是我的第一个版本的更好版本-

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

答案 1 :(得分:1)

不如您所拥有的其他解决方案那么优雅,但这是另一种方式:

df <- data.frame('a' = c(1:50), 'c' = rep(0,50))

df$c[sample(
  # subset to sample
  df$a[df$a > 25], 
  # sample size
  size = round(length(df$a[df$a > 25])/5, 0), 
  # no replacement 
  replace = F)] <- 1

您没有工作,因为您在df$c > 25而不是df$a的地方采样

df$c[sample(x=(   df$c   [df$a>25]), size = round(NROW(df$c[df$a>25])/5), replace = F)] <- 1