根据条件

时间:2016-12-04 04:26:15

标签: r dplyr

我有两张桌子,我试图以特定的方式加入。一个是简单的tibble,提供HEX颜色及其与之相关的类别:

library(tibble)
library(dplyr)

colors <- tibble(Category = c("A", "B", "C", "D"),
                  Colors = c("#0079c0", "#cc9900", "#252525", "#c5120e"))

# A tibble: 4 × 2
   Category Colours
     <chr>   <chr>
1        A #0079c0
2        B #cc9900
3        C #252525
4        D #c5120e

我还有另一个类别,它将类别列为行和列,并以特定方式显示:

Main_Table <- tibble(Category = c("A", "B", "C", "D"),
                     A = c(NA, "A", NA, NA),
                     B = c(NA, NA, NA, NA),
                     C = c(NA, "C", NA, NA),
                     D = c("D", "D", NA, NA))

# A tibble: 4 × 5
  Category     A     B     C     D
     <chr> <chr> <lgl> <chr> <chr>
1        A  <NA>    NA  <NA>     D
2        B     A    NA     C     D
3        C  <NA>    NA  <NA>  <NA>
4        D  <NA>    NA  <NA>  <NA>

我希望根据其相应的类别是否存在于带有其名称的变量下,将颜色加入主表中。例如,假设我想要包含D类的颜色,我最终会得到以下内容:

Main_Table_Goal <- tibble(Category = c("A", "B", "C", "D"),
                     A = c(NA, "A", NA, NA),
                     B = c(NA, NA, NA, NA),
                     C = c(NA, "C", NA, NA),
                     D = c("D", "D", NA, NA),
                     color = c("#c5120e", "#c5120e", NA, NA))

# A tibble: 4 × 6
    Category     A     B     C     D    color
      <chr>  <chr> <lgl>  <chr> <chr>   <chr>
1        A   <NA>    NA   <NA>     D  #c5120e
2        B      A    NA      C     D  #c5120e
3        C   <NA>    NA   <NA>  <NA>     <NA>
4        D   <NA>    NA   <NA>  <NA>     <NA>

如何使用dplyr实现此目的?我一直在尝试*_join和其他技巧,但我没有得到任何地方。

编辑:我应该提到我最终会将其包含在一个函数中,所以理想情况下代码可以灵活地适应任意数量的类别。

1 个答案:

答案 0 :(得分:2)

我不确定您的数据中有多少类别。但如果你只有四个(即A,B,C和D),则以下是一种方式。我想使用一个数据框。所以我最初合并了两个数据帧。因为我想使用mutate_at(),所以我将B转换为逻辑到字符。然后,我用四种颜色替换了四个类别。最后,我删除了Colors并将B转换为逻辑。

library(dplyr)

left_join(Main_Table, colors) %>%
mutate(B = as.character(B)) %>%
mutate_at(vars(A:D),
          funs(color = recode(., A = Colors[1],
                                 B = Colors[2],
                                 C = Colors[3],
                                 D = Colors[4]))) %>%
select(-Colors) %>%
mutate(B = as.logical(B)) 

考虑到阿克伦的想法,你可以做到以下几点。只要您可以告诉您有多少类别,就可以在vars()中指定列。如果所有列都是字符,则无需将逻辑转换为字符。

left_join(Main_Table, colors) %>%
mutate(B = as.character(B)) %>%
mutate_at(vars(A:D),funs(color = Colors[match(., Category)])) %>%
select(-Colors) %>%
mutate(B = as.logical(B)) 


#  Category     A     B     C     D A_color B_color C_color D_color
#     <chr> <chr> <lgl> <chr> <chr>   <chr>   <chr>   <chr>   <chr>
#1        A  <NA>    NA  <NA>     D    <NA>    <NA>    <NA> #c5120e
#2        B     A    NA     C     D #0079c0    <NA> #252525 #c5120e
#3        C  <NA>    NA  <NA>  <NA>    <NA>    <NA>    <NA>    <NA>
#4        D  <NA>    NA  <NA>  <NA>    <NA>    <NA>    <NA>    <NA>