R在数据框

时间:2017-01-31 23:23:58

标签: r random swap

我重复了一个实验(rep1和rep2)。对于每个复制品,我有两列(a,sum)和两行属于一起的受试者(AA组,BB ......)。为了分析,我想将收集的数据(a和sum)随机分配给rep1和rep2。 为此,我试图随机选择组并交换" a"和"总和" rep1和rep2。我试图重复随机交换100次,创建100个数据集进行分析。

我遇到unique(df$groups)来指定每个组的数据属于一起。结合到sample(unique(df$group), 2),它会随机抽样,比如2组。但我不知道如何交换这些选定组的重复数据。

以下是数据示例:

group = c("A", "A", "B", "B", "C", "C")
rep1_a = c(2, 8, 5, 5, 4, 6)
rep1_sum = c(10, 10, 10, 10, 10, 10)
rep2_a = c(3, 8, 4, 5, 5, 6)
rep2_sum = c(11, 11, 9, 9, 11, 11)
df = data.frame(group, rep1_a, rep1_sum, rep2_a, rep2_sum)

#    group    rep1_a     rep1_sum     rep2_a   rep2_sum
1     A          2         10          3         11
2     A          8         10          8         11
3     B          5         10          4          9
4     B          5         10          5          9
5     C          4         10          5         11
6     C          6         10          6         11

这就是它应该是什么样子,如果在这3组中,A组的重复被交换:

    group     rep1_a    rep1_sum    rep2_a    rep2_sum
1     A          3         11          2         10
2     A          8         11          8         10
3     B          5         10          4          9
4     B          5         10          5          9
5     C          4         10          5         11
6     C          6         10          6         11

2 个答案:

答案 0 :(得分:1)

这是使用dplyr执行此操作的一种方法。下面的代码重复创建新的数据集,其中rep1和rep2按组的相同混合,并对数据集进行100次所需的分析。

library(dplyr)   
exp_data <- data_frame()
analysis_result <- data_frame()
for (i in 1:100){
# Your new 'experiment' by mixing two real experiment randomly, indicated by 'exp_id'

  new_df <- df %>%
    group_by(group) %>%
    mutate(x = runif(1)) %>%
    mutate(repr_a = ifelse(x>0.5,rep1_a,rep2_a), repr_sum =  ifelse(x>0.5,rep1_sum,rep2_sum),exp_id=i) %>%
    select(exp_id,group,repr_a,repr_sum)
  # Your analysis - below is my example
  new_analysis <- new_df %>%
    group_by(exp_id,group) %>%
    summarise(outcome = mean(repr_a*repr_sum))
  exp_data <- bind_rows(exp_data,new_df)
  analysis_result <- bind_rows(analysis_result,new_analysis)
}

答案 1 :(得分:0)

data.table版本:

library(data.table)
setDT(df)
df[,swap := sample(c(TRUE,FALSE),1), by=group]
rbind(
 df[(!swap)],
 df[(swap), setNames(.group,rep2_a,rep2_sum,rep1_a,rep1_sum,swap),names(df)) ]
)[order(group)]

如果swap变量返回FALSE,它只是交换列,否则组中的行集将保持不变。