在 id 内将向量的不同级别加在一起

Sum different levels of a vector together within id

'我的数据可能是这样的

id <- c('A1','A1','A1','A1','B2','B2','B2','B2','C3','C3','C3','C3')
event <- c('a', 'b', 'c', 'd','a', 'b', 'c', 'd','a', 'b', 'c', 'd')
value <- c(3,2,5,3,6,5,7,6,4,5,6,7)
Dat <- data.frame(id, event, value)

现在我想做的是根据 id 中事件的不同级别将某些值加在一起。例如,在每个 id 中组合 a、b 和 c 会产生一个新的级别,假设 comb_abc(对于 id A1,它将是 10)。然后,ID A1 在事件向量“comb_abc”= 10 和“some_name”(d) = 3 上只有两个级别。这里我将级别 a、b 和 c 更改为 comb_abc 和 d 到 some_name。每个 id 都会发生同样的情况。 我该怎么做?

THNAK YOU!!

您可以将 'a''b''c' 的值更改为 'comb_abc',并将其余值 ('d') 更改为 'some_name' 并为每个 idevent.

sum of value
aggregate(value~id+event, transform(Dat, 
         event = ifelse(event %in% c('a','b','c'), 'comb_abc', 'some_name)), sum)

dplyr 中,可以这样做:

library(dplyr)

Dat %>%
  mutate(event = if_else(event %in% c('a','b','c'), 'comb_abc', 'some_name')) %>%
  group_by(id, event) %>%
  summarise(value = sum(value))

#  id    event     value
#  <chr> <chr>     <dbl>
#1 A1    comb_abc     10
#2 A1    some_name     3
#3 B2    comb_abc     18
#4 B2    some_name     6
#5 C3    comb_abc     15
#6 C3    some_name     7

这是另一个基础 R 选项 aggregate

aggregate(
  value ~ id + cbind(event = c("some_name", "comb_abc")[1 + event %in% c("a", "b", "c")]),
  Dat,
  sum
)

这给出了

  id     event value
1 A1  comb_abc    10
2 B2  comb_abc    18
3 C3  comb_abc    15
4 A1 some_name     3
5 B2 some_name     6
6 C3 some_name     7

如果您要组合的关卡不止一个,这里有一个小示例向您展示了一种可能的选择

set.seed(1)
v <- sample(letters[1:8],20,replace = TRUE)
comb <- list(c("a","b","c"),c("d","e","f"),c("g","h"))
res <- sapply(comb, paste0,collapse = "")[Reduce(`+`,lapply(seq_along(comb), function(k) k*(v %in% comb[[k]])))]

这给出了

> res
 [1] "abc" "def" "gh"  "abc" "abc" "def" "gh"  "abc" "def" "abc" "abc" "abc"
[13] "abc" "def" "def" "abc" "def" "def" "abc" "gh"