首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据R中最常见的条目更新data.frame中的列

如何根据R中最常见的条目更新data.frame中的列
EN

Stack Overflow用户
提问于 2022-09-30 02:35:52
回答 2查看 41关注 0票数 1
代码语言:javascript
复制
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列进行表格化,并为这个人分配最常见的代码。

代码语言:javascript
复制
> 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。

最后的产出应是:

代码语言:javascript
复制
> 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中有什么快速的方法可以做到吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-30 02:39:56

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2022-09-30 03:11:33

在R基础上我们可以做到

代码语言:javascript
复制
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     2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73903446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档