2015-02-17 5 views
4

Предположим, у меня есть кадр данных с любым количеством переменных плюс 3 переменные для цвета RGB. Я хочу преобразовать цвет RGB в LAB и добавить их в фрейм данных. Вот уродливый код:мутировать несколько столбцов, сгенерированных с помощью одной функции?

df <- data.frame(id=c(1:10),red=runif(10),green=runif(10),blue=runif(10)) 
df <- cbind(df,convertColor(subset(df,select=c("red","green","blue")),from="sRGB",to="Lab")) 

Было бы здорово, если бы мутировать может генерировать несколько переменных с помощью одного вызова; например (псевдокод):

df <- data.frame(id=c(1:10),red=runif(10),green=runif(10),blue=runif(10)) 
df <- df %>% mutate(list("L","a","b") = convertColor(cbind(red,green,blue),from="sRGB",to="Lab")) 

Есть ли аналогичный подход с использованием dplyr?

+0

Быстрый комментарий, пожалуйста, избегайте 'df' как имени для data.frame. 'df' уже является функцией R. Вместо этого вы можете использовать 'DF'. –

+0

Я не уверен, почему первый код «уродливый» - он требует меньше ввода, чем 'dplyr' делает ?! Кроме того, вы можете упростить, например, 'cbind (df, convertColor (df [c (" красный "," зеленый "," синий ")], from =" sRGB ", to =" Lab "))' – thelatemail

+0

@Pascal «Я играю вокруг с плотностями и распределениями F, я не думаю, что использование« df »для быстрого примера наносит большой вред ... –

ответ

2

Если вы хотите, чтобы некоторые синтаксического сахара, вы можете использовать этот код:

df %>% 
    select(red,green,blue) %>% 
    convertColor(from="sRGB",to="Lab") %>% 
    cbind(df,.) 
+0

Я очень мало знаю о 'dplyr' , но является внутренним 'bind_cols', предпочитаемым' cbind'? – thelatemail

+0

'bind_cols' - это новая вещь в' dplyr' (http://blog.rstudio.org/2015/01/09/dplyr-0-4-0/), и я еще не изучил ее –

+0

Perfect, благодаря! Настолько много разборчиво, чем мое. –

2

Если вы хотите, чтобы избежать ненужного копирования данных, это data.table синтаксиса, чтобы добавить новые столбцы путем изменения данных на месте:

library(data.table) 
dt = as.data.table(df) 

dt[, c('L', 'a', 'b') := as.data.table(convertColor(.SD, from = 'sRGB', to = 'Lab')) 
    , .SDcols = c('red', 'green', 'blue')] 
Смежные вопросы