mydat <- data.frame(name = c("James", "James", "James", "James", "Leila", "Leila", "Cici", "Bob", "Bob", "Holly", "Topaz", "Topaz"),
code = c(123, 928, 981, 333, 981, 928, 463, 123, 928, 981, 333, 444))
> mydat
name code
1 James 123
2 James 928
3 James 981
4 James 333
5 Leila 981
6 Leila 928
7 Cici 463
8 Bob 123
9 Bob 928
10 Holly 981
11 Topaz 333
12 Topaz 444在mydat中,每个人都可以有多个与其关联的code。我想对code列进行表格化,并为这个人分配最常见的代码。
> rbind(table(mydat), Total = colSums(table(mydat)))
123 333 444 463 928 981
Bob 1 0 0 0 1 0
Cici 0 0 0 1 0 0
Holly 0 0 0 0 0 1
James 1 1 0 0 1 1
Leila 0 0 0 0 1 1
Topaz 0 1 1 0 0 0
Total 2 2 1 1 3 3鲍勃拥有codes 123和928。由于928在mydat中出现的频率比123更多,所以鲍勃将被分配一个928的code。
Cici有code 463,因此Cici将被分配一个代码463。
Holly有code 981,因此Holly将被分配一个代码981。
詹姆斯拥有codes 123、333、928和981。由于928和981的出现频率都高于123和333,詹姆斯将被分配给codes 928和981。
最后的产出应是:
> final_mydat
name final_code
1 Bob 928
2 Cici 463
3 Holly 981
4 James 928
5 James 981
6 Leila 928
7 Leila 981
8 Topaz 333在R中有什么快速的方法可以做到吗?
发布于 2022-09-30 02:39:56
library(dplyr)
mydat %>%
add_count(code) %>%
group_by(name) %>%
slice_max(n) %>%
ungroup()
# # A tibble: 8 × 3
# name code n
# <chr> <dbl> <int>
# 1 Bob 928 3
# 2 Cici 463 1
# 3 Holly 981 3
# 4 James 928 3
# 5 James 981 3
# 6 Leila 981 3
# 7 Leila 928 3
# 8 Topaz 333 2如果要删除... %>% select(-n)列,请添加n。
发布于 2022-09-30 03:11:33
在R基础上我们可以做到
by(transform(mydat, score=ave(code, code, FUN=length)), mydat$name, \(x) {
with(x, x[score == max(score), ])}) |> c(make.row.names=FALSE) |> do.call(what=rbind)
# name code score
# 1 Bob 928 3
# 2 Cici 463 1
# 3 Holly 981 3
# 4 James 928 3
# 5 James 981 3
# 6 Leila 981 3
# 7 Leila 928 3
# 8 Topaz 333 2https://stackoverflow.com/questions/73903446
复制相似问题