【问题标题】:R randomly swap values between two columns in dataframeR在数据框中的两列之间随机交换值
【发布时间】:2017-06-17 13:58:29
【问题描述】:

我重复了一个实验(rep1 和 rep2)。对于每个重复,我有两列(a,sum)和两行属于一起的测试对象(组 AA,BB ...)。为了分析,我想将收集到的数据(a和sum)随机分配给rep1和rep2。 为此,我试图随机选择组并交换 rep1 和 rep2 的“a”和“sum”。我正在尝试重复随机交换 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

【问题讨论】:

    标签: r random swap


    【解决方案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)
    }
    

    【讨论】:

    • 您好 Julius,非常感谢您提供的简洁代码!它完全符合我的要求。但是,为了运行分析,我需要在 new_df 中保留两个“新”复制的列。有没有办法为各自的 repr_b 和 reprb_sum 添加列?
    • Julius 的代码为随机复制 1 创建了两列。为了对两个复制运行分析,我对其进行了扩展以获取复制 2 的相应值。exp_data &lt;- data_frame() for (i in 1:100){ new_df &lt;- df %&gt;% group_by(group) %&gt;% mutate(x = runif(1)) %&gt;% mutate(repr_a = ifelse(x&gt;0.5,rep1_a,rep2_a), repr_a_sum = ifelse(x&gt;0.5,rep1_sum, rep2_sum)) %&gt;% mutate(repr_b = ifelse(x&lt;0.5,rep_1,rep_2), repr_b_sum = ifelse(x&lt;0.5,rep1_sum, rep2_sum), exp_id = i) %&gt;% select(exp_id,group,repr_a,repr_a_sum, repr_b, repr_b_sum) exp_data &lt;- bind_rows(exp_data,new_df)}
    【解决方案2】:

    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,它只是交换列,否则返回组中的行集不变。

    【讨论】:

      猜你喜欢
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2018-05-23
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多