2014-01-04 4 views
2

Рассмотрим мы имеем числовую data.frame foo и хотите найти сумму каждых двух столбцов:Установить имена столбцов при вызове функции

foo <- data.frame(x=1:5,y=4:8,z=10:14, w=8:4) 
bar <- combn(colnames(foo), 2, function(x) foo[,x[1]] + foo[,x[2]]) 
bar 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] 5 11 9 14 12 18 
#[2,] 7 13 9 16 12 18 
#[3,] 9 15 9 18 12 18 
#[4,] 11 17 9 20 12 18 
#[5,] 13 19 9 22 12 18 

Все хорошо, за исключением имен столбцов, которые отсутствуют bar , Я хочу, чтобы имена столбцов из bar, чтобы показать соответствующие столбцы в foo, например, в этом примере:

colnames(bar) <- apply(combn(colnames(foo),2), 2, paste0,collapse="") 
colnames(bar) 
#[1] "xy" "xz" "xw" "yz" "yw" "zw" 

Это просто, но я хочу, чтобы выполнить разметку столбцов в одной и той же bar <- combn(...) команды. Там в любом случае?

ответ

3

Возможно, но это зафускирует ваш код. Компромисс между кратностью и ясностью здесь острый.

Чтобы понять, как это работает, я ссылаюсь на this question.

colnames(x) <- y 

внутренне переписано как

x <- `colnames<-`(x,y) 

Вы можете сделать перевод самостоятельно.

bar <- `colnames<-`(combn(colnames(foo), 2, function(x) foo[,x[1]] + foo[,x[2]]), 
        apply(combn(colnames(foo),2), 2, paste0,collapse="")) 

Во многих случаях, однако, это не стоит ментальной и синтаксической гимнастики, необходимой разрушаться строками коды таким образом. Несколько линий, как правило, более ясны.

+0

+1 для использования нескольких линий. Четкость до краткости, код для чтения, а не компьютеры. –

+0

Интересный ответ. Есть ли способ присвоить имя столбца 'function (x)' result? Если это так, мы можем пропустить функцию 'apply (...)'. Я знаю, что это не работает внутри функции 'combn()' в соответствии с ответом @ RomanLuštrik, но это может быть полезно в другом месте. – Ali

3

Вы начинаете с data.frame, а не из матрицы. Не так важно, но это помогает не отставать от жаргона, который мы обычно используем.

То, что вам нужно, невозможно. Если вы посмотрите на код combn, когда результат упрощен, он не использует имена измерений.

} 
    if (simplify) 
     array(out, dim.use) 
    else out 
} 

Вы можете взломать функцию и сделать его добавить имена измерений, или, вы можете добавить его вручную, чтобы ваш результат после Festum.

+0

Спасибо, я сменил матрицу на data.frame в OP – Ali

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