代码之家  ›  专栏  ›  技术社区  ›  Alper Yilmaz

从R中的RGB数据帧保存多个PNG

  •  1
  • Alper Yilmaz  · 技术社区  · 6 年前

    我有一个如下所示的数据框。我想在此数据框中保存两个png文件,命名基于 sample 1.png 2.png 使用各列上的rgb值,两者都是2x3像素大。

    据我所知,我需要为每个通道准备一个3d阵列,然后使用 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 回复  |  直到 6 年前
        1
  •  2
  •   Aurèle    6 年前

    例如:

    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)
    

    或者没有tidyverse:

    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))