2015-07-20 4 views
1

У меня есть 7 кадров данных экспериментов, каждый из которых подразделяется на 15 повторений (или итераций). Меня интересует все переменная x для расчета позже в анализе.Как извлечь 105 переменных для вычисления в R

Представьте, что вы имеете следующее dataframes рандомизированных чисел и, для простоты, делают вид, что все dataframes содержат различные номера:

set.seed(2) 

a <- runif(100, -1.5, 1.5) 
b <- pnorm(rnorm(100)) 
c <- rnorm(100) 
d <- rnorm(100) 
e <- dnorm(rnorm(100)) 
iteration <- sort(sample(1:7, 100, replace=T), decreasing=F) 
x <- f <- sample(1:1000, 100, replace=T) 

df1 <- data.frame(a,b,c,d,e,iteration,x) 
df2 <- data.frame(a,b,c,d,e,iteration,x) 
df3 <- data.frame(a,b,c,d,e,iteration,x) 
df4 <- data.frame(a,b,c,d,e,iteration,x) 
df5 <- data.frame(a,b,c,d,e,iteration,x) 
df6 <- data.frame(a,b,c,d,e,iteration,x) 
df7 <- data.frame(a,b,c,d,e,iteration,x) 

Как я могу сломать все 105 переменной x комбинацию (df1$x of iteration 1, df1$x of iteration 2 , ..., df7$x of iteration 7), чтобы я мог рассчитать следующее примерное уравнение бессмыслицы для всех 105 переменных комбинаций?

mean(df1$x of iteration 1) - sd(df1$x of iteration 1) 
mean(df1$x of iteration 2) - sd(df1$x of iteration 2) 
... 
mean(df7$x of iteration 7) - sd(df7$x of iteration 7) 

Я имею следующую команду для того, чтобы «извлечь» переменной df1$x of iteration 1 но это будет связано с более 208 линий, чтобы прийти для остальных переменных:

df_1 <- df1[which(df1$iteration=='1'),] 
df_1_final <- df_1[grepl("1", df_1$iteration), c(6, 7)] 

ли это смысл? Нет ли лучшего способа сделать это в Gnu R?

+0

Попробуйте 'd1 <- expand.grid (id = paste0 ('df', 1: 7), iteration = 1: 15); sapply (seq_len (nrow (d1)), function (i) {x1 <- подмножество (get (as.character (d1 [i, 1])), итерация == d1 [i, 2], select = x), mean (x1 [, 1]) - sd (x1 [, 1])}) ' – akrun

ответ

1

Вы можете создать функцию уравнения нонсенса, а затем использовать его в tapply() с, iteration как аргумент INDEX, для каждого df. Итак, для df1: tapply(df1$x, INDEX = df1$iteration, nonsenseFunction), который вернет список/массив со всеми вычислениями для каждой группы (итерации) df1.

+0

спасибо, маленький_data88. Это решение работает, но должно применяться 7 раз, а его вывод не так четко структурирован, как результат решения 'bindrows'. –

+1

@TilHund Правильно и да, структура вывода может стать грязной с 'tapply'. Я просто пытался показать другой способ сделать это, не устанавливая и не изучая 'dplyr'. –

+1

Исправлено с 'sort (result, убывающее = F)'. –

3

A возможность используя dplyr. Вероятно, проще работать с вашим data.frames в списке (с комментариев) @akrun

library(dplyr) 

bind_rows(mget(paste0('df', 1:7))) %>% # put your data.frames in a list -> data.frame 
    mutate(group=rep(1:7, each=100)) %>% # add a grouping column 
    group_by(group, iteration) %>%  # group 
    summarise(mean(x) - sd(x))   # do your stuff 

или в data.table

rbindlist(mget(paste0('df', 1:7)))[,mean(x)-sd(x) ,.(gr=rep(1:7,each=100),iteration)] 
+1

Или используя' data.table' 'rbindlist (mget (paste0 ('df', 1: 7))) [, mean (x) -sd (x),. (Gr = rep (1: 7, каждый = 100), итерация)] ' – akrun

+0

Это твоя идея, я просто удалил мой, поскольку он был более подробным. – akrun

+0

Используя 2 revs 'и nongkrongs' bindrows' с моими исходными данными здесь, я получаю In 'Error: неправильный размер результата (1896), ожидаемый 28440 или 1. rbind_all (x): Неодинаковые уровни факторов: принуждение к символу. Что я сделал не так? –

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