Сохранить несколько PNG из фрейма данных RGB в R - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть фрейм данных, который выглядит как ниже. Я хочу сохранить два png-файла из этого фрейма данных, названные по имени столбца sample, 1.png и 2.png размером 2x3 пикселя, используя значения rgb в соответствующих столбцах.

Насколько я могу судить, мне нужно подготовить трехмерный массив для каждого канала, а затем использовать функцию writePNG для каждого массива для сохранения в виде файла PNG, но я застрял после вложения значений rgb для каждого семпла.

Буду признателен за любую помощь (помощь в tidyverse и purrr способ будет оценен больше;)

Фрейм данных:

| sample| pixel| red| green| blue|
|------:|-----:|---:|-----:|----:|
|      1|     1| 255|     0|    0|
|      1|     2| 255|    32|    0|
|      1|     3| 255|    64|    0|
|      1|     4| 255|    96|    0|
|      1|     5| 255|   128|    0|
|      1|     6| 255|   159|    0|
|      2|     1| 255|   191|    0|
|      2|     2| 255|   223|    0|
|      2|     3| 255|   255|    0|
|      2|     4| 255|   255|   42|
|      2|     5| 255|   255|  128|
|      2|     6| 255|   255|  213|

Вот код для генерации этого фрейма данных:

test_df <- data_frame(sample=rep(1:2,each=6), pixel=rep(1:6,2)) %>% 
  bind_cols(as_data_frame(t(col2rgb(heat.colors(12))))) 

1 Ответ

0 голосов
/ 25 апреля 2018

Например:

library(purrr)

test_df %>% 
  split(.$sample) %>% 
  setNames(paste0(names(.), ".png")) %>% 
  map(~ array(c(.x$red, .x$green, .x$blue), c(2, 3, 3)) / 255) %>%
  iwalk(png::writePNG)

Или более "пошаговым" способом:

test_df %>% 
  split(.$sample) %>% 
  setNames(paste0(names(.), ".png")) %>% 
  map(`[`, 3:5) %>% 
  map(as.matrix) %>% 
  map(`/`, 255) %>% 
  map(array, c(2, 3, 3)) %>% 
  iwalk(png::writePNG)

Или без перехода на следующий уровень:

z <- split(test_df, test_df$sample)
mapply(function(x, y) {
  png::writePNG(array(as.matrix(x[3:5]), c(2, 3, 3)) / 255, paste0(y, ".png"))
}, z, names(z))  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...