我有一个问题要将一些名称更改为其他名称然后加总值。抱歉标题不好,请换一个更好的标题。
我会在这里解释一下
这是我的数据:
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
中,A
和B
更改为X
,然后加ColD
和ColE
。
如果ColC
为C
,D
和E
,则应为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
")
答案 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)