2017-01-31 4 views
2

Я повторил эксперимент (rep1 и rep2). Для каждого репликации у меня есть два столбца (a, sum) и две строки испытуемых предметов, которые принадлежат друг другу (группа AA, BB ...). Для анализа я хотел бы случайным образом назначить собранные данные (a и sum) на rep1 и rep2. Для этого я пытался случайным образом выбирать группы и менять «a» и «sum» rep1 и rep2. Я пытаюсь повторить случайную замену 100 раз, создав 100 наборов данных для анализа.R случайным образом меняет значения между двумя столбцами в dataframe

Я столкнулся с 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-й групп, дублированные группы А перепутано:

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 

ответ

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) 
} 
+0

Привет, Julius, спасибо за аккуратный код! Он делает именно то, что я искал. Однако, чтобы выполнить анализ, мне нужно сохранить столбцы для «новых» реплик в new_df. Есть ли способ добавить столбцы для соответствующих repr_b и reprb_sum? – lampi

+0

Код Юлиуса создает два столбца для рандомизированного репликации 1. Для запуска анализа на обеих репликах я расширил его, чтобы получить соответствующие значения для репликации 2. 'exp_data <- data_frame() для (i в 1: 100) { new_df <- df %>% group_by (group)%>% mutate (x = runif (1))%>% mutate (repr_a = ifelse (x> 0,5, rep1_a, rep2_a), repr_a_sum = ifelse (x> 0,5, rep1_sum , rep2_sum))%>% mutate (repr_b = ifelse (x <0,5, rep_1, rep_2), repr_b_sum = ifelse (x <0,5, rep1_sum, rep2_sum), exp_id = i)%>% select (exp_id, group, repr_a, repr_a_sum, repr_b, repr_b_sum) exp_data <- bind_rows (exp_data, new_df)} ' – lampi

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, в противном случае набор строк в группе возвращается без изменений.

Смежные вопросы