簡體   English   中英

R在數據幀中的兩列之間隨機交換值

[英]R randomly swap values between two columns in dataframe

我重復了一個實驗(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

這是使用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)
}

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 ,它只是交換列,否則組中的行集將保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM