按组计算唯一值

bvo*_*owe 8 r dplyr

    DATA = data.frame("TRIMESTER" = c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3),
                      "STUDENT" = c(1,2,3,4,5,6,7,1,2,3,5,9,10,11,3,7,10,6,12,15,17,16,21))
    
    WANT = data.frame("TRIMESTER" = c(1,2,3),
                      "NEW_ENROLL" = c(7,3,5),
                      "TOTAL_ENROLL" = c(7,10,15))
Run Code Online (Sandbox Code Playgroud)

我有“数据”,想要制作“想要”,它有三列,对于每个“学期”,您计算新“学生”的数量,然后对于“TOTAL_ENROLL”,您只需计算每个学期唯一“学生”的总数。

我的尝试只计算每个学期的数量。

library(dplyr)
DATA %>%
group_by(TRIMESTER) %>%
count()
Run Code Online (Sandbox Code Playgroud)

Rui*_*das 9

这是一个方法。

\n
suppressPackageStartupMessages(library(dplyr))\n\nDATA <- data.frame("TRIMESTER" = c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3),\n                  "STUDENT" = c(1,2,3,4,5,6,7,1,2,3,5,9,10,11,3,7,10,6,12,15,17,16,21))\nDATA %>% \n  mutate(NEW_ENROLL = !duplicated(STUDENT)) %>%\n  group_by(TRIMESTER) %>%\n  summarise(NEW_ENROLL = sum(NEW_ENROLL)) %>%\n  ungroup() %>%\n  mutate(TOTAL_ENROLL = cumsum(NEW_ENROLL))\n#> # A tibble: 3 \xc3\x97 3\n#>   TRIMESTER NEW_ENROLL TOTAL_ENROLL\n#>       <dbl>      <int>        <int>\n#> 1         1          7            7\n#> 2         2          3           10\n#> 3         3          5           15\n
Run Code Online (Sandbox Code Playgroud)\n

由reprex 包于 2022 年 8 月 14 日创建(v2.0.1)

\n


Moh*_*uky 9

  • 对于多样性,我们可以Base R aggregate使用transform
transform(aggregate(. ~ TRIMESTER , DATA[!duplicated(DATA$STUDENT),] , length),
         TOTAL_ENROLL = cumsum(STUDENT))
Run Code Online (Sandbox Code Playgroud)
  • 输出

  TRIMESTER STUDENT TOTAL_ENROLL
1         1       7            7
2         2       3           10
3         3       5           15
Run Code Online (Sandbox Code Playgroud)