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