如何解决在id
“我的数据可能是这样的
id <- c('A1','A1','B2','C3','C3')
event <- c('a','b','c','d','a','d')
value <- c(3,2,5,3,6,7,4,7)
Dat <- data.frame(id,event,value)
现在我想做的是基于id中事件的不同级别将某些值加起来。例如,在每个将a,b和c组合在一起的id中,这将产生一个新的级别,让我们说comb_abc(对于id A1来说是10)。然后,ID A1在事件向量“ comb_abc” = 10和“ some_name”(d)= 3上只有两个级别。在这里,我将级别a,b和c更改为comb_abc,将d更改为some_name。每个ID也会发生相同的情况。 我该怎么办?
想你!
解决方法
您可以将'a'
,'b'
和'c'
的值更改为'comb_abc'
,并将其余的('d'
)更改为'some_name'
并分别为sum
和value
取id
中的event
。
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','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
,
这是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","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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。