R:引用函数中的colnames

时间:2014-12-23 07:14:02

标签: r function dataframe

我想将一个函数应用于数据帧的所有列。在该函数中,我想使用相应的colnames。然而,这些都丢失了 - 我如何保留它们,或者在功能中引用它们?

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"

3 个答案:

答案 0 :(得分:3)

如果您使用lapply代替colMeans,则不需要mean

   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))
  }  

答案 1 :(得分:2)

由于paste已向量化,因此您可以使用colMeans,而不必循环任何内容。

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"

答案 2 :(得分:1)

你可以尝试

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