当前位置: 首页 > 知识库问答 >
问题:

基于组添加计数器

戎鹏云
2023-03-14

我正在尝试将计数器列(n_teamn_bird)添加到数据帧中,但使用dplyr::row_number等没有成功。下面是输入数据帧(df)和所需输出数据帧(df_counts)以及几个错误输出的代码的代表。

library(dplyr)

# Input
df <- 
  tribble(
    ~id, ~team,     ~bird,
    1,  "blue",  "parrot",
    2, "green",     "owl",
    3,  "blue",  "toucan",
    3,  "blue",   "finch",
    4, "green", "penguin",
    4,  "blue", "sparrow"
  )

# Desired output
# n_team is the team number within an id
# n_bird is the bird number within a team within an id
df_counts <- 
  tribble(
    ~id, ~team,     ~bird, ~n_team, ~n_bird,
    1,  "blue",  "parrot",      1,        1,
    2, "green",     "owl",      1,        1,
    3,  "blue",  "toucan",      1,        1,
    3,  "blue",   "finch",      1,        2,
    4, "green", "penguin",      1,        1,
    4,  "blue", "sparrow",      2,        1
  )

# Incorrect
df %>% 
  add_count(id, team, name = "n_team")
#> # A tibble: 6 x 4
#>      id team  bird    n_team
#>   <dbl> <chr> <chr>    <int>
#> 1     1 blue  parrot       1
#> 2     2 green owl          1
#> 3     3 blue  toucan       2
#> 4     3 blue  finch        2
#> 5     4 green penguin      1
#> 6     4 blue  sparrow      1

df %>% 
  group_by(id) %>% 
  mutate(n_team =  row_number(team))
#> # A tibble: 6 x 4
#> # Groups:   id [4]
#>      id team  bird    n_team
#>   <dbl> <chr> <chr>    <int>
#> 1     1 blue  parrot       1
#> 2     2 green owl          1
#> 3     3 blue  toucan       1
#> 4     3 blue  finch        2
#> 5     4 green penguin      2
#> 6     4 blue  sparrow      1

df %>% 
  group_by(id, team) %>% 
  mutate(n_team =  1:n())
#> # A tibble: 6 x 4
#> # Groups:   id, team [5]
#>      id team  bird    n_team
#>   <dbl> <chr> <chr>    <int>
#> 1     1 blue  parrot       1
#> 2     2 green owl          1
#> 3     3 blue  toucan       1
#> 4     3 blue  finch        2
#> 5     4 green penguin      1
#> 6     4 blue  sparrow      1

df %>% 
  group_by(id) %>% 
  mutate(n_team =  n_distinct(team))
#> # A tibble: 6 x 4
#> # Groups:   id [4]
#>      id team  bird    n_team
#>   <dbl> <chr> <chr>    <int>
#> 1     1 blue  parrot       1
#> 2     2 green owl          1
#> 3     3 blue  toucan       1
#> 4     3 blue  finch        1
#> 5     4 green penguin      2
#> 6     4 blue  sparrow      2

df %>% 
  add_count(team)
#> # A tibble: 6 x 4
#>      id team  bird        n
#>   <dbl> <chr> <chr>   <int>
#> 1     1 blue  parrot      4
#> 2     2 green owl         2
#> 3     3 blue  toucan      4
#> 4     3 blue  finch       4
#> 5     4 green penguin     2
#> 6     4 blue  sparrow     4

# Counts alphabetically
df %>% 
  group_by(id, team) %>% 
  mutate(n_bird =  row_number(bird))
#> # A tibble: 6 x 4
#> # Groups:   id, team [5]
#>      id team  bird    n_bird
#>   <dbl> <chr> <chr>    <int>
#> 1     1 blue  parrot       1
#> 2     2 green owl          1
#> 3     3 blue  toucan       2
#> 4     3 blue  finch        1
#> 5     4 green penguin      1
#> 6     4 blue  sparrow      1

# Counts in order
df %>% 
  group_by(id, team) %>% 
  mutate(n_bird =  row_number())
#> # A tibble: 6 x 4
#> # Groups:   id, team [5]
#>      id team  bird    n_bird
#>   <dbl> <chr> <chr>    <int>
#> 1     1 blue  parrot       1
#> 2     2 green owl          1
#> 3     3 blue  toucan       1
#> 4     3 blue  finch        2
#> 5     4 green penguin      1
#> 6     4 blue  sparrow      1
  • 通过排列两个变量来添加计数器列(dplyr)
  • https://community.rstudio.com/t/how-to-add-a-counter-to-each-group-in-dplyr/12986/2
  • https://dplyr.tidyverse.org/reference/tally.html
  • https://dplyr.tidyverse.org/reference/n_distinct.html

共有1个答案

西门嘉澍
2023-03-14

以下是4种非常相似但又不同的方法:

  1. 匹配+唯一:
library(dplyr)
df %>%
  group_by(id) %>%
  mutate(n_teams = match(team, unique(team))) %>%
  group_by(team, .add = TRUE) %>%
  mutate(n_bird =  match(bird, unique(bird)))

#    id team  bird    n_teams n_bird
#  <dbl> <chr> <chr>     <int>  <int>
#1     1 blue  parrot        1      1
#2     2 green owl           1      1
#3     3 blue  toucan        1      1
#4     3 blue  finch         1      2
#5     4 green penguin       1      1
#6     4 blue  sparrow       2      1
df %>%
  group_by(id) %>%
  mutate(n_teams = as.integer(factor(team))) %>%
  group_by(team, .add = TRUE) %>%
  mutate(n_bird =  as.integer(factor(bird)))
df %>%
  group_by(id) %>%
  mutate(n_teams = data.table::rleid(team)) %>%
  group_by(team, .add = TRUE) %>%
  mutate(n_bird =  data.table::rleid(bird))
df %>%
  group_by(id) %>%
  mutate(n_teams = dense_rank(team)) %>%
  group_by(team, .add = TRUE) %>%
  mutate(n_bird =  dense_rank(bird))
 类似资料:
  • 我需要帮助找出如何完成第3步。。请我正在使用的教科书并没有很好地解释计数函数,它只是以我下面的编码方式显示了这个“len”函数,这是不正确的。 > 在程序的开始处添加输入()语句。输入()应该提示用户输入一个正的起始数。 使用用户键入的数字作为for循环的起始值。循环应该打印输入的数字和该数字的负值之间的所有奇数。 我能够完成#的1和2,但我不能得到#3。这是我到目前为止...

  • 我有两个嵌套的< code>v-for元素,看起来像: 我想只展示前五个产品,不考虑类别数量和每个类别的产品数量。 如何在第二个 元素内获取累积索引计数(相对于从 categoryIndex 父数组显示的产品总数)?

  • 这看起来很容易,但却不知道该怎么做。当前数组数据是按日期和日期列出的,因此我需要将所有日期组合起来:天、月、6个月、1年。我需要将数组数据排列为下面的第二个数组。

  • 坦率地说,我一直在思考如何实现一些超出我数学能力的东西。因此,请随意尝试并为我指出正确的方向,而不是完整的代码解决方案,我将非常感谢您的帮助。 所以,假设我对文本进行了分析,并生成了不同两个字符组合的频率表。我已将这些存储在26x26阵列中。如。 所以我想随机选择这两个字符组合,但我想根据频率来“权衡”我的选择。也就是说,上面的AB应该是AA的“可能性”的15倍。而且,很明显,选择永远不应该返回类

  • 但是用于添加新项或移除项的HTTPendpoint是什么样子的呢? 现在,我必须指定整个数组,包括我不想接触的元素:

  • 问题内容: 我正在尝试在页面加载后根据其所在的页面将一个类(即)添加到适当的菜单列表项。下面是我现在的菜单。我已经尝试了在这方面可以找到的所有代码片段,但是没有任何效果。因此,有人可以简单解释一下在何处以及如何在JavaScript中添加以定义此任务吗? 这是我在网站管理员中将head标签放入的javascript的示例。我究竟做错了什么? 问题答案: 这不起作用的原因是因为javascript正