2011-06-29 51 views
2

定義:在列表中與dataframes工作:重命名變量

dats <- list(df1 = data.frame(A=sample(1:3), B = sample(11:13)), 
     df2 = data.frame(AA=sample(1:3), BB = sample(11:13))) 

S.T.

> dats 
$df1 
    A B 
1 2 12 
2 3 11 
3 1 13 

$df2 
    AA BB 
1 1 13 
2 2 12 
3 3 11 

我想將所有大寫字母的所有變量名更改爲較低。我能做到這一點有一個循環,但不知何故不能得到這個lapply調用工作:

dats <- lapply(dats, function(x) 
      names(x)<-tolower(names(x))) 

導致:

> dats 
$df1 
[1] "a" "b" 

$df2 
[1] "aa" "bb" 

,而期望的結果是:

> dats 
$df1 
    a b 
1 2 12 
2 3 11 
3 1 13 

$df2 
    aa bb 
1 1 13 
2 2 12 
3 3 11 

回答

2

如果您不要在函數結尾使用return,返回最後一個計算表達式。所以你需要返回x

dats <- lapply(dats, function(x) { 
      names(x)<-tolower(names(x)) 
      x}) 
+0

非常感謝。我錯過了大括號,但爲什麼需要返回x?很難理解「如果你不在功能的末尾使用'return',最後一次求值的表達式返回」 – Fred

+0

你的例子中大括號是不必要的;我不得不添加它們,因爲我有不止一行。你函數中的「最後評估表達式」是names(x)< - tolower(names(x))'。該賦值的結果分別是「a」,「b」和「aa」,「bb」,這就是函數返回的結果。例如,嘗試'(names(x)< - tolower(names(x)))''。 –

+0

好的,檢查幫助文件(?函數不起作用,'函數'),現在明白了。這個例子清楚說明了函數(x,y){z < - x^2 + y^2; return(x + y + z)}':返回值與表達式中評估的返回值不同,這增加了更多的自由度。在我的情況下,所需的返回值是數據幀,而不是向量'names(x)'。 – Fred