2016-02-09 161 views
0

內dataframes的列名與dataframes的名單,像這樣修改列表

library(data.table) 
IDn = c("ChrM", "ChrM" ,"ChrM" ,"ChrM" ,"ChrM") 
posn = c(2,5,7,8,9) 
met = c(2,0,4,1,0) 
nmet = c(2,1,0,2,0) 
bd = c(3,3,0,8,10) 
dfp = data.frame(IDn,posn,met,nmet,bd) 
    IDn  posn met nmet bd 
1 ChrM 2 2 2 3 
2 ChrM 5 0 1 3 
3 ChrM 7 4 0 0 
4 ChrM 8 1 2 8 
5 ChrM 9 0 0 10 
L1<-list(d1=dfp, d2=dfp, d3=dfp) 
    $d1 
    IDn posn met nmet bd 
1 ChrM 2 2 2 3 
2 ChrM 5 0 1 3 
3 ChrM 7 4 0 0 
4 ChrM 8 1 2 8 
5 ChrM 9 0 0 10 

$d2 
    IDn posn met nmet bd 
1 ChrM 2 2 2 3 
2 ChrM 5 0 1 3 
3 ChrM 7 4 0 0 
4 ChrM 8 1 2 8 
5 ChrM 9 0 0 10 

$d3 
    IDn posn met nmet bd 
1 ChrM 2 2 2 3 
2 ChrM 5 0 1 3 
3 ChrM 7 4 0 0 
4 ChrM 8 1 2 8 
5 ChrM 9 0 0 10 

我想換工作,例如BD列的名稱BD和DF的名稱;

我試過使用lapplypaste0("bd",names(l1)),但是當我只需要每個df一個時,這個名稱就加起來了。

+0

輕鬆可行的,但爲什麼你會想這樣做?這意味着你將最終擁有以變量名稱存儲在變量名稱中的附加數據。爲什麼不用「data.frame」的「名稱」添加一列? – A5C1D2H2I1M1N2O1R2T1

+0

對不起,我過於簡單了。我添加了另一個列,其中列出了一個條件爲: = cA)&(met> = bd))]])' 因此,現在我需要將「crit」列的名稱更改爲獨特的名稱,以便在將它們摺疊爲單個表格時進行比較。 –

+2

由於您已經加載了「data.table」,只需使用'idcol = TRUE'的'rbindlist'來顯示數據來自哪裏。 – A5C1D2H2I1M1N2O1R2T1

回答

4

我們可以使用Map來包裝你在問題中提到的邏輯:

Map(function(df,i) {names(df)[5] <- paste0("bd", names(L1)[i]);df}, L1, 1:length(L1)) 
# $d1 
# IDn posn met nmet bdd1 
# 1 ChrM 2 2 2 3 
# 2 ChrM 5 0 1 3 
# 3 ChrM 7 4 0 0 
# 4 ChrM 8 1 2 8 
# 5 ChrM 9 0 0 10 
# 
# $d2 
# IDn posn met nmet bdd2 
# 1 ChrM 2 2 2 3 
# 2 ChrM 5 0 1 3 
# 3 ChrM 7 4 0 0 
# 4 ChrM 8 1 2 8 
# 5 ChrM 9 0 0 10 
# 
# $d3 
# IDn posn met nmet bdd3 
# 1 ChrM 2 2 2 3 
# 2 ChrM 5 0 1 3 
# 3 ChrM 7 4 0 0 
# 4 ChrM 8 1 2 8 

對於data.table你可以嘗試:

for(i in 1:length(L1)) setnames(L1[[i]], "bd", paste0("bd", names(L1)[i])) 
+0

上述代碼適用於我爲'data.table'添加的兩種情況 –

+0

。我認爲for循環是這種情況下最快的方法。 –

+0

這個伎倆。非常感謝! –