我有两张桌子,我试图以特定的方式加入。一个是简单的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
和其他技巧,但我没有得到任何地方。
编辑:我应该提到我最终会将其包含在一个函数中,所以理想情况下代码可以灵活地适应任意数量的类别。
答案 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>