将值更改为其他值和Sum值

时间:2017-09-20 07:52:38

标签: r data-manipulation

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

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    

DATA

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
")

3 个答案:

答案 0 :(得分:4)

假设您有一个数据表(由于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

答案 1 :(得分:2)

一些基本的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

答案 2 :(得分:0)

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)