dplyr在case_when

时间:2017-08-18 16:47:30

标签: r dplyr

假设我有一个数据框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;fe;qa;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

1 个答案:

答案 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=";")))