2014-01-28 63 views
2

我試圖將部分變量與其名稱中的數字組合在一起。我有數百個與我在下面的例子中包含的名稱類似的變量,因此不想使用簡單的cbind將變量的部分與其名稱中的數字結合起來

的例子:

test.1 <- matrix(1:10, nrow = 5) 
test.2 <- matrix(11:20, nrow = 5) 
test.3 <- matrix(21:30, nrow = 5) 

我可以輕鬆地使用do.call的變量組合在一起,就像這樣:

test.combi_works <- do.call(cbind, lapply(paste0("test.", 1:3), get)) 

但我只需要每個矩陣的第一列。

第一次嘗試:

test.combi <- do.call(cbind, lapply(paste0("test.", 1:3, "[,1]"), get)) 
Error in FUN(c("test.1[,1]", "test.2[,1]", "test.3[,1]")[[1L]], ...) : 
    object 'test.1[,1]' not found 

第二次嘗試:

test.combi2 <- do.call(cbind, lapply(noquote(paste0("test.", 1:3, "[,1]")), get)) 
Error in FUN(X[[1L]], ...) : object 'test.1[,1]' not found 

我認爲這是與事實做get作品與字符串。我不能簡單地將所有矩陣綁定在一起,然後刪除,因爲我實際上正在處理其他元素並不總是具有相同尺寸的列表。

+0

當你'paste0'你不'subset',所以'GET'試圖達到目標test.1 [,1],它不存在。我會嘗試在l'apply函數後面使用子集,但我不熟悉'do.call'函數 – Llopis

+0

爲什麼在工作區中有「數百個變量」?好的做法是在創建時將它們保存在列表中。 – Roland

+0

@羅蘭感謝您的提示。我被迫這樣做,因爲我正在使用NbClust並且不需要所有的索引。因此,我必須爲每個索引創建一個對象。然後我需要一個總結矩陣,所以在這種情況下,一個列表不幸會幫助我。 –

回答

1

您可以將新函數傳遞給do.call以執行獲取和子集化。正如@Llopis指出的那樣,問題在於test.1[,1]不僅僅是一個對象;它是一個對象(test.1),其中應用了函數([,1]是函數調用)。由於get僅適用於對象,因此應首先獲取對象,然後應用子集功能。

對於單個對象,這將是這樣的:

myfun <- function(x) { get(x)[,1] } 
myfun("test.1") 

,您還可以通過同樣的功能爲lapply

test.combi_works <- do.call(
    cbind, lapply(paste0("test.", 1:3), function(x) { get(x)[,1] }) 
) 
1

這裏有一個解決方案,而無需使用paste和字符串

do.call(cbind, 
     lapply(mget(ls()[grep('test',ls())]), function(x) x[ , 1])) 

我想@Roland想說什麼,sub真的,保持你的工作空間是一種很好的基本做法,可以避免以後的錯誤。列表是一個非常簡單的方法。

 test.1 test.2 test.3 
[1,]  1  11  21 
[2,]  2  12  22 
[3,]  3  13  23 
[4,]  4  14  24 
[5,]  5  15  25 
相關問題