[英]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.