2014-12-23 22 views
0

我想將一個函數應用於數據框的所有列。在那個函數中,我想使用各自的colnames。但是,這些都丟失了 - 我如何保留它們,或者在函數內引用它們?R:引用功能中的姓名

data <- data.frame("A" = rnorm(500, 0, 1), 
        "B" = rnorm(500, 0, 1)) 

funk <- function(x,...){ 
    paste(colnames(x), " & ", round(mean(x, na.rm = T), 1), sep = "") 
} 

lapply(data, funk) 

給出:

$A 
[1] " & -0.1" 

$B 
[1] " & 0.1" 

但我想:

$A 
[1] "A & -0.1" 

$B 
[1] "B & 0.1" 

回答

1

您可以嘗試

lapply(seq_len(ncol(data)), function(i) 
    paste(colnames(data[i]), " & " , round(mean(data[,i], 
             na.rm=TRUE), 1), sep="")) 
2

由於paste被矢量,你可以使用colMeans用它,而不是必須l任何東西都可以。

paste(names(data), " & ", round(colMeans(data), 1)) 

所以我可能會寫這樣的功能:

funk <- function(x, digits = 1L, na.rm = TRUE) { 
    means <- round(colMeans(x, na.rm = na.rm), digits = digits) 
    setNames(as.list(paste(names(x), " & ", means)), names(x)) 
} 
funk(data) 
# $A 
# [1] "A & 0" 
# 
# $B 
# [1] "B & 0" 

funk(data, digits = 3) 
# $A 
# [1] "A & 0.023" 
# 
# $B 
# [1] "B & -0.046" 

但是從您的評論好像你可能想知道如何應用名稱一到一個你正在申請一項職能。對於您可能想看看Map和/或mapply

Map(paste, names(data), " & ", round(colMeans(data), 3)) 
# $A 
# [1] "A & 0.023" 
# 
# $B 
# [1] "B & -0.046" 
3

如果使用colMeans代替mean你並不需要一個lapply

funk <- function(x,...){ 
    paste(colnames(x), " & ", round(colMeans(x, na.rm = T), 1), sep = "") 
    } 

然後就是:

funk(data) 

編輯:上面會給你一個簡單的character向量作爲輸出。如果你想用的名字根據您所需的輸出list,只是定義funk如下:

funk <- function(x,...){ 
    setNames(as.list(paste(colnames(x), " & ", round(colMeans(x, na.rm = T), 1), sep = "")),names(x)) 
    } 
+0

謝謝,但平均()是微不足道的。它關於將colname粘貼到列上任何函數的輸出。 –