假设我有一个数据框df
library(dplyr)
df <- data.frame(ID = c(1:10), Type = c('a', 'a;b','b','a','b','b','c','a;c','b;c','c'))
我想根据color
中显示的值添加一个名为Type
的列。 (这只是一个示例,在我的代码中有Type
的更多变体,即d;f
,e;q
,a;z
等等。
df %>%
mutate(color = case_when(
Type == 'a' ~ 'red',
Type == 'b' ~ 'blue',
Type == 'c' ~ 'green',
TRUE ~ as.character(Type)
))
现在,它返回
ID Type color
1 1 a red
2 2 a;b a;b
3 3 b blue
4 4 a red
5 5 b blue
6 6 b blue
7 7 c green
8 8 a;c a;c
9 9 b;c b;c
10 10 c green
我很好奇是否有办法在case_when()
内用分号分割,以便产生输出
ID Type color
1 1 a red
2 2 a;b red;blue
3 3 b blue
4 4 a red
5 5 b blue
6 6 b blue
7 7 c green
8 8 a;c red;green
9 9 b;c blue;green
10 10 c green
答案 0 :(得分:3)
您可以将 Type 列拆分为单独的行,将其映射到颜色,然后将它们粘贴在一起:
library(dplyr); library(tidyr);
df %>%
separate_rows(Type) %>%
mutate(color = case_when(
Type == 'a' ~ 'red',
Type == 'b' ~ 'blue',
Type == 'c' ~ 'green',
TRUE ~ as.character(Type)
)) %>%
group_by(ID) %>%
summarise_all(funs(paste0(., collapse=";")))
# A tibble: 10 x 3
# ID Type color
# <int> <chr> <chr>
# 1 1 a red
# 2 2 a;b red;blue
# 3 3 b blue
# 4 4 a red
# 5 5 b blue
# 6 6 b blue
# 7 7 c green
# 8 8 a;c red;green
# 9 9 b;c blue;green
#10 10 c green
除了case_when
之外,你还可以将角色放在矢量中的颜色贴图中,然后再检索颜色:
map <- c(a = 'red', b = 'blue', c = 'green')
df %>%
separate_rows(Type) %>%
mutate(color = map[Type]) %>%
group_by(ID) %>%
summarise_all(funs(paste0(., collapse=";")))