2015-12-31 2 views
-2

Я начинаю работать с более крупными наборами данных, и мне нужен способ автоматизации функций, которые я уже использую. Рамка, которую я надеюсь достичь, применит цикл в dplyr select(), чтобы идентифицировать группы управления и соответствующие экспериментальные группы в большом кадре данных, затем выполнить функцию (ы), сохранить вывод и, наконец, повторить цикл для все образцы в наборе данных.написать цикл в dplyr select()

Данные сложны в том, что я часто работаю с наборами данных, которые содержат более 3000 образцов, поэтому отбор каждого образца в заголовках столбцов приведет к поражению эффективности использования компьютерной программы.

Макет данных на самом деле прост. Каждая контрольная группа обозначается как «контроль», каждая экспериментальная группа обозначается как «эксперимент». Чтобы связать каждый элемент управления с его экспериментальной группой, я добавил числовую составляющую, так что control1 будет соответствовать экспериментам1, control2 и exper2 и т. Д. Наконец, многие экспериментальные группы соответствуют одному и тому же элементу управления, поэтому я добавил алфавитный компонент: exper1a и exper1b оба соответствуют контролю1.

Вот пример заголовка таблицы:

переменная control1 control1 exper1a exper1a exper1b exper1b

EDIT ### см воспроизводимых данных, предоставленных Пьером в зарегистрированном ответ ### Извините за не предоставляя мои собственные данные.

Я бы хотел, чтобы код искал первое целое число «управление», а затем нашел соответствующий эксперимент с одним и тем же целым числом. В группе эприральных групп, которые соответствуют управлению1, я хотел бы идентифицировать первую группу alapbetic и сохранить итоговую таблицу. Например:

переменная control1 control1 exper1a exper1a

Далее, я хотел бы код, чтобы повторить эту функцию для всех других пар EXPER goups с Control1 (т.е. exper1b), и когда все EXPER группы были исчерпаны для управления1, перейдите на элемент управления2 .. и повторите это, пока не останется больше групп контроля.

В принципе, я просто хочу кучу небольших столов, сделанных из одного большого стола.

Вот что я кусочкам до сих пор, что работает:

library(readr) 
library(dplyr) 
df<-read.csv("big_table.csv") 

Я знаю, что это жалкая, но это лучше, чем листинг 100+ неудачных попыток я пытался. вот теоретические основы я представлял себе работать:

# define i as a list of integers without a limit 
# define n as a list alpahbetical characters, start at a, stop at z 
for(i in 1:ncol(x)) { 
    select(df, variable, contains(i)) 
    for(n in a:ncol(x)){ 
     selcect(df, variable, contains(n)) 
write.csv("controli_experin.csv") 
# where i in controli is the variable "i", and "in" represents the variables "i" and "n" in experin. 
}} 

Надеюсь, это дает каждому представление о том, что я пытаюсь сделать. В идеале я смогу применить этот код к большим и небольшим наборам данных, если номенклатура столбцов следует той же схеме.

Заранее благодарю вас за помощь.

+0

Это плохая практика, чтобы назвать два столбца одинаково, например 'переменное управление1 control1 exper1 exper1'. Если вы вызываете 'df [," control1 "]', как бы вы (или процессор) знали, какой столбец следует ожидать? –

+0

Пара комментариев: (1), так как у нас нет вашего CSV, показывая нам, что код, который вы используете для его чтения, довольно бессмысленен (тем более, что ваш вопрос не имеет никакого отношения к чтению данных. Скорее, вы должны попробовать сделайте свой вопрос [воспроизводимым] (http://stackoverflow.com/q/5963269/903061), в этом случае самый простой способ - это, вероятно, предоставить код для имитации данных. (2) Возможно, вы захотите прочитать [подробные данные ] (http://vita.had.co.nz/papers/tidy-data.pdf), у вас, кажется, есть «группы» столбцов, которые, вероятно, будут иметь более длинную форму, чем их текущая широкая форма. – Gregor

+0

И (3) если вы настаиваете на использовании переменных столбцов, а не на преобразовании в длинную форму и просто используете 'group_by', есть [очень красиво виньетировано на стандартной и нестандартной оценке в dplyr] (https://cran.r-project.org /web/packages/dplyr/vignettes/nse.html), который должен быть вашей отправной точкой. – Gregor

ответ

1

Вот пример с воспроизводимым примером.В основном мы ищем цифру в именах столбцов и объединить каждый набор чисел с первой колонкой:

library(stringr) 
nums <- as.integer(str_extract(names(df1)[-1], "\\d+")) 
lapply(unique(nums), function(x) cbind(df1[1], df1[,c(F,nums == x)])) 
# [[1]] 
#  variable  ctrl1a  ctrl1b  expr1a  expr1b 
# 1 -0.08051177 0.6160930 -0.1509403 -1.1601206 0.84550630 
# 2 0.69528553 0.9835623 -0.2764147 0.9141205 1.74502652 
# 3 -1.75956316 -0.4281811 0.4065561 -0.4831384 -0.56058428 
# 4 0.36156427 1.1100194 1.2543866 -0.7526051 0.50255499 
# 5 2.08312138 -0.9252150 1.4087865 -0.5825413 -0.12795336 
# 6 -0.35242288 1.0341357 0.3862441 1.0471908 -0.45732123 
# 7 -0.45336626 0.3514331 -0.7843920 0.6576382 -1.39281599 
# 8 1.34009843 -0.4036598 -0.4233619 -0.1027439 0.04361829 
# 9 -0.06922307 -1.6241054 0.6889851 0.9623857 -0.26017311 
# 
# [[2]] 
#  variable  ctrl2a  ctrl2b  expr2a  expr2b 
# 1 -0.08051177 -0.5602536 -0.09769381 -0.5693422 0.5097039 
# 2 0.69528553 2.4807524 0.67856805 -0.5307254 -0.8791350 
# 3 -1.75956316 0.1682293 -0.05482072 0.1568936 -0.4955552 
# 4 0.36156427 -0.2044310 0.80732824 -1.6120776 0.2843847 
# 5 2.08312138 0.3807844 0.99740970 -1.6695074 -0.5224782 
# 6 -0.35242288 -1.1126282 0.62537929 -0.6152809 1.2340156 
# 7 -0.45336626 -2.6516954 1.74563891 0.5517721 1.6779573 
# 8 1.34009843 -1.3851439 -0.62581919 -1.1300818 -0.1788827 
# 9 -0.06922307 -1.0398341 -0.89502608 -1.1915519 0.3488837 

воспроизводимых данные

set.seed(1231) 
df1 <- data.frame(matrix(rnorm(81), 9,9)) 
names(df1) <- c("variable", paste0(rep(c("ctrl", "expr"), 2, each=2), rep(1:2, each=4), c("a", "b"))) 
Смежные вопросы