2015-04-02 29 views
-1

我有一個數據框列表(通過讀取目錄中的每個文件創建);每個數據幀包含4列:遍歷數據框列表並解析數據框名稱以檢索新列的值

hit_name (character) 
hit_raw_value (real) 
hit_norm_value (real) 
hit_significance (real) 

另外我想爲每個數據框添加3列,名爲 - 藥名,劑量和組。特定數據框中每列的值在所有行中都是相同的,並可通過解析該數據框的名稱獲得,格式爲:「drugname_dose_group_date_studyname」。例如,一個數據框被稱爲「tylenol_5mg_group1_oct14_pilotstudy」,所以我想要添加的'drugname'列將採用值'tylenol','dose'列將採用值'5mg',並且組列將採用值'group1'。

下面我試過的代碼將x $ drugname設置爲包含該數據框中所有已存在列的名稱的字符串,而不是將其設置爲'drugname'。

all_files = lapply(paste(mydir,filenames,sep="") ,read.delim) 
names(all_files) = gsub(".txt","", filenames) 
lapply(all_files, 
    function(x) { 
     x$drugname = gsub(".+?\\_(.+?)\\_(.+?)\\_(.+?)\\_.+", "\\1", deparse(quote(x))) 
     x$dose = gsub(".+?\\_(.+?)\\_(.+?)\\_(.+?)\\_.+", "\\2", deparse(quote(x)))   
     x$group = gsub(".+?\\_(.+?)\\_(.+?)\\_(.+?)\\_.+", "\\3", deparse(quote(x))) 
} 
+1

請整理這個問題,並顯示您的數據框架和輸入的確切結構。 – 2015-04-02 02:03:12

+0

你可以用'dput'來粘貼一個可重複使用的小數據集示例 – RockScience 2015-04-02 02:06:14

+0

'deparse(quote(x))'不太可能在'lapply'裏面工作 – RockScience 2015-04-02 02:11:57

回答

0

deparse(quote(x))返回x的lapply內,因爲變量x被定義。

你可以嘗試,而不是這個

for (i in names(all_files)){ 
    newCols = strsplit(names(all_files)[i], "_")[[1]] 
    all_files[[i]]$drugname = newCols[1] 
    all_files[[i]]$dose  = newCols[2] 
    ... 
} 
do.call(rbind, all_files) 
+0

非常感謝 - 非常好的工作,對strsplit函數調用的小修改。我粘貼下面的最終代碼版本。 – BioBos 2015-04-02 04:24:30

+0

@BioBos的確我忘了指定「_」......謝謝你。我讓我的答案成爲一個社區wiki,以便您可以編輯它。我不推薦使用'unlist',因爲它不能保證順序,而是使用'[[1]]選擇字符串split的第一個元素' – RockScience 2015-04-02 04:34:47

0

的這段代碼工作了通過dataframes的名稱循環和填充新的$ drugname和$適當劑量列,謝謝你的幫助:

for (i in names(all_files)){ 
    newCols = unlist(strsplit(names(all_files)[i], "_")) 
    all_files[[i]]$drugname = newCols[1] 
    all_files[[i]]$dose  = newCols[2] 
    ... 
} 
相關問題