2015-12-31 48 views
-2

我開始使用更大的數據集,我需要一種方法來自動化我已經使用的函數。我希望實現的框架將在dplyr select()中應用一個循環來識別控制組和相應的大型數據框中的實驗組,然後執行函數,保存輸出,最後重複循環數據集中的所有樣本。在dplyr中編寫一個循環select()

數據很複雜,因爲我經常處理包含3000多個樣本的數據集,因此寫出列標題中的每個樣本都會影響使用計算機程序的效率。

數據的佈局非常簡單。每個對照組標記爲「對照」,每個實驗組標記爲「exper」。爲了將每個控件與它的實驗組配對,我添加了一個數字組件,這樣control1將對應於exper1,control2到exper2等。最後,許多實驗組對應於相同的控件,因此我添加了一個按字母順序的組件:exper1a和exper1b都對應於control1。

這裏是一個表頭的一個示例:

可變CONTROL1 CONTROL1 exper1a exper1a exper1b exper1b

EDIT ###請參閱由Pierre在所檢查的答案提供的可再生的數據###對不起,不提供我自己的數據。

我想要代碼查找「控制」的第一個整數,然後找到相同的整數具有相同的exper。在對應於control1的eprimental組中,我想確定第一個alapbetic組,並保存結果表。例如:

可變控制1控制1 exper1a exper1a

接下來,我想代碼重複此功能適用於所有其他對EXPER goups與控制1(即exper1b),一旦所有EXPER組已用盡對於control1,移動到control2 ..,並重復此操作,直到不再有控制組保留。

基本上我只想要一堆由一張大桌子製成的小桌子。

這裏是我到目前爲止的作品拼湊起來:

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

這是不好的做法,同樣名稱的兩個列,例如'variable control1 control1 exper1 exper1'。如果你調用'df [,「control1」]',你(或cpu)怎麼知道列的期望? –

+0

有幾點意見:(1)因爲我們沒有你的CSV,所以向我們顯示你用來閱讀它的代碼是毫無意義的(特別是因爲你的問題與閱讀數據無關,而應該嘗試讓你的問題[可重現](http://stackoverflow.com/q/5963269/903061),在這種情況下,最簡單的方法可能是提供用於模擬數據的代碼。(2)你可能想閱讀[tidy data ](http://vita.had.co.nz/papers/tidy-data.pdf),你似乎有一組「列」,這些列可能會比現有的廣泛形式做得更好。 – Gregor

+0

And( 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")))