Mutate函数仅改变第一行,然后为每个后续行打印相同的结果

时间:2017-08-24 15:20:23

标签: r dplyr

我有一个包含十六进制颜色值的列的数据框。我想改变数据框,以便我可以在单独的列中使用红色,蓝色和绿色值(rgb格式),因此我使用override func viewDidLoad() { super.viewDidLoad() self.scrollView.contentSize.height = 1000 } 包中的col2rgb函数。这就是我命名为grDevices的数据框在变异之前的样子:

color_count

这是我改变数据框的代码:

      hex Count
    <chr> <int>
1 #00000B     3
2 #00000C    10
3 #00000D     1
4 #00000E    42
5 #00000F     4

这是输出:

color_rgb <- color_count %>%
  mutate(r = col2rgb(hex)[1], g = col2rgb(hex)[2], b = col2rgb(hex)[3])

rgb值仅对第一行正确,每隔一行只显示完全相同的组合。

我尝试使用 hex Count r g b <chr> <int> <int> <int> <int> 1 #00000B 3 0 0 11 2 #00000C 10 0 0 11 3 #00000D 1 0 0 11 4 #00000E 42 0 0 11 5 #00000F 4 0 0 11 作为this other thread建议,但它没有用。

2 个答案:

答案 0 :(得分:1)

> col2rgb(color_count$hex)
      [,1] [,2] [,3] [,4] [,5]
red      0    0    0    0    0
green    0    0    0    0    0
blue    11   12   13   14   15

> class(col2rgb(color_count$hex))
[1] "matrix"

col2rgb为您提供了一个矩阵,因此您需要按而不是元素进行索引:

> col2rgb(color_count$hex)[1,]
[1] 0 0 0 0 0
> col2rgb(color_count$hex)[2,]
[1] 0 0 0 0 0
> col2rgb(color_count$hex)[3,]
[1] 11 12 13 14 15

[]中的索引后添加逗号意味着您按行和列而不是按元素进行索引。 ,之前的数字是行索引,而 ,之后的数字是列索引。

library(dplyr)

color_rgb <- color_count %>%
  mutate(r = col2rgb(hex)[1,], g = col2rgb(hex)[2,], b = col2rgb(hex)[3,])

#       hex Count r g  b
# 1 #00000B     3 0 0 11
# 2 #00000C    10 0 0 12
# 3 #00000D     1 0 0 13
# 4 #00000E    42 0 0 14
# 5 #00000F     4 0 0 15

答案 1 :(得分:0)

这是一个避免在每一行中多次调用col2rgb的解决方案,而却牺牲了使用一些更复杂的tidyverse操作

library(tidyverse)

color_rgb <- color_count %>%
  group_nest(hex, Count) %>%
  mutate(
    data = map(hex, ~col2rgb(.) %>% t %>% as_tibble)
  ) %>%
  unnest(data)

# A tibble: 5 x 5
#  hex     Count   red green  blue
#  <chr>   <dbl> <int> <int> <int>
# 1 #00000B     3    0     0    11
# 2 #00000C    10    0     0    12
# 3 #00000D     1    0     0    13
# 4 #00000E    42    0     0    14
# 5 #00000F     4    0     0    15