我正在使用R中的数据框,其中有一列$ Z $。我想要添加一个额外的列$ X $,其中包含$ 0.5 $和$ -0.5 $,这表示两个 不同的群体。我的目标是让团队中的人数达到0.5美元,而团体收入为-0.5美元。我尝试过寻找解决方案,但我唯一能遇到的是sample()函数,它不会给出相同的组,但只是使用相同的概率。
到目前为止,我使用的代码是:
Z = rnorm(1000, 50, sd = 5)
df = data.frame(Z)
答案 0 :(得分:3)
只需复制-0.5
和0.5
每次nrow(df) / 2
次的值,然后对人口进行抽样。这将创建一个随机向量,每个值的数量相等。
df$X <- sample(rep(c(-0.5, 0.5), nrow(df) / 2))
答案 1 :(得分:0)
使用sample
函数,我创建了一个随机的行顺序。所以我给你的df rownames和第二个df rownames。比我用-0.5分配500个值,其余值为0.5。
多次运行random
,看其完全随机,但0.5和-0.5在最终df中存在500次。
library(tidyverse)
random <- function() {
Z = rnorm(1000, 50, sd = 5)
df = as_tibble(Z) %>% rename(Z=value) %>% rownames_to_column() # create column for merging
result <- sample(1:1000) %>%
as_tibble() %>%
mutate(X=ifelse(value>=500, 0.5, -0.5)) %>% # assigning 500 values with -0.5 and the rest with 0.5
rownames_to_column() %>% # rownumer as column
right_join(df, by="rowname") %>% # merge both df's
select(Z, X, -rowname, -value) # clean up columns
print(result)
}
random()
答案 2 :(得分:0)
随机选择,无需替换,从1到整数的一半的整数的一半;补充是另一组。
让我们创建一个用于测试的数据框:
X <- data.frame(Z=rnorm(10))
以下是一个解决方案的R
实现:
n <- nrow(X)
X$Group <- ifelse(sample.int(n, n) * 2 <= n, 1/2, -1/2)
要将数据框随机分组到g
组,样本1..n(随机置换行索引)并将其模数减去模g
:
g <- 2
X$Group <- factor(sample.int(n, n) %% g)
每组的人数都在1之内。