2009-11-17 65 views
4

假設您嘗試在函數內創建數據框。我希望能夠提前定義列名作爲函數的參數之一。採取以下代碼:提前指定函數內的數據幀的列名稱

foo <- function(a) { 
    answer <- data.frame(a=1:5) 
    return(answer) 
    } 

在上述例子中,我想能夠在功能foo(),例如以指定列名的值foo('my.name')以便答案的列名稱爲my.name而不是a。我想你可以在使用colnames()的函數中對它進行編碼,但我對另一種方法感興趣。

+1

我想不出什麼比使用'colnames(回答)簡單< - 在了'foo的結束。如果列表中有名稱,可以使用'as.data.frame(list(a = 1,b = 2,c = 3))'。你能澄清爲什麼在你的特定情況下,你的姓氏對你來說顯得笨重嗎? – Harlan

+0

那麼假設數據框有多列。在這種情況下,你需要寫更多的東西,比如'colnames(答案)[colnames(answer)=='a'] < - 'foo''我主要關心一個替代方案,涉及到與'substitute()'有關的東西。 – andrewj

+1

如果你給出了一個你想要完成的事情的具體例子,可能會更有用,並且可能會描述一下你使用substitute()的想法 – geoffjentry

回答

7

使用colnames是我知道data.frame的唯一方法,儘管colnames()本身就是一個向量,所以不需要對它進行任何迭代。此版本處理兩列:

foo <- function(cname) { 
    answer <- data.frame(1:5, 1:5) 
    colnames(answer) <- cname 
    return(answer) 
} 
> foo(c("a","b")) 
    a b 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
4

下面是使用substituteeval的替代品。

foo <- function(var) { 
    eval(substitute(data.frame(var = 1:5)), list(var = as.name(var))) 
} 

我希望你會同意colnames解決方案更簡單。

1

Shane代碼的小調整,以防您真的想要使用substitute,或者您真的不能打擾多餘的引號。

foo <- function(a) { 
    answer <- data.frame(1:5) 
    colnames(answer) <- as.character(substitute(a)) 
    answer 
} 
foo(mycolname) 

    mycolname 
1   1 
2   2 
3   3 
4   4 
5   5 
1

的setNames功能就足夠了:

> foo <- function(a,nm) { 
+  answer <- data.frame(a=1:5) 
+  setNames(answer, nm) 
+  } 
> foo(1:10, 'bar') 
    bar 
1 1 
2 2 
3 3 
4 4 
5 5 
相關問題