2014-12-23 1 views
0

Я хочу применить функцию ко всем столбцам данных. Внутри этой функции я хочу использовать соответствующие имена столбцов. Однако они потеряны - как я могу их хранить или иначе ссылаться на них внутри функции?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

Вам не нужно 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)) 
    } 
+0

Спасибо, но среднее() тривиальна. Его о вставке colname в вывод любой функции в столбце. –

Смежные вопросы