将值更改为其他值并求和值

Change value to others and Sum value

我有一个问题要将一些名称更改为其他名称然后求和。抱歉,标题不好,请换一个更好的。
我会在这里解释。
这是我的数据:

ColA     ColB   ColC   ColD    ColE
APPLE    1      A      100      30 
APPLE    1      B      200      20
APPLE    1      C      100      50
APPLE    1      D       50     100
APPLE    1      E       50     100
APPLE    2      C       50     100 
BANANA   1      A       30      50
BANANA   1      C       20      20
BANANA   3      B      100     100
BANANA   3      C       50      50
BANANA   3      D      100     200

ColC中,AB改为X,然后求和ColDColE
如果ColCCDE,则应为Y,然后求和
结果如下:

ColA    ColB    ColC    ColD    ColE
APPLE    1       X       300     50
APPLE    1       Y       200    250
APPLE    2       Y        50    100
BANANA   1       X        30     50
BANANA   1       Y        20     20
BANANA   3       X       100    100
BANANA   3       Y       150    250    

数据

dt <- fread("ColA     ColB   ColC   ColD    ColE
APPLE    1      A      100      30 
APPLE    1      B      200      20
APPLE    1      C      100      50
APPLE    1      D       50     100
APPLE    1      E       50     100
APPLE    2      C       50     100 
BANANA   1      A       30      50
BANANA   1      C       20      20
BANANA   3      B      100     100
BANANA   3      C       50      50
BANANA   3      D      100     200
")

一些基本的dplyr:

先用case_when改变变量,然后分组求和

library(dplyr)
dt %>% 
  mutate(ColC = case_when(ColC %in% c("A", "B") ~ "X", TRUE ~ "Y")) %>% 
  group_by(ColA, ColB, ColC) %>% 
  summarise_all(sum)

给出:

# A tibble: 7 x 5
# Groups:   ColA, ColB [?]
    ColA  ColB  ColC  ColD  ColE
   <chr> <int> <chr> <int> <int>
1  APPLE     1     X   300    50
2  APPLE     1     Y   200   250
3  APPLE     2     Y    50   100
4 BANANA     1     X    30    50
5 BANANA     1     Y    20    20
6 BANANA     3     X   100   100
7 BANANA     3     Y   150   250

假设你有一个数据table(由于fread)那么这里是一个想法。

library(data.table)

dt[, ColC := ifelse(ColC %in% c('A', 'B'), 'X', 'Y')
   ][, lapply(.SD, sum), by = .(ColA, ColB, ColC)][]

这给出了,

     ColA ColB ColC ColD ColE
1:  APPLE    1    X  300   50
2:  APPLE    1    Y  200  250
3:  APPLE    2    Y   50  100
4: BANANA    1    X   30   50
5: BANANA    1    Y   20   20
6: BANANA    3    X  100  100
7: BANANA    3    Y  150  250
dt$ColC <- plyr::revalue(dt$ColC,c("A"="x","B"="x","C"="Y","D"="Y","E"="Y"))

dt %>% 
     group_by(ColA,ColB,ColC) %>% 
                               summarise_all(sum)