我想将一个函数应用于数据帧的所有列。在该函数中,我想使用相应的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"
答案 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=""))