在 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'
并为每个 id
和 event
.
取 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"
'我的数据可能是这样的
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'
并为每个 id
和 event
.
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"