簡體   English   中英

R DPLYR 按組計數值

[英]R DPLYR Count Values BY Group

HAVE = data.frame(  STUDENT =c( 1,1,2,2,2,3,3   ),
    TEST    =c( 'A','B','A','B','C','A','C' ))

WANT = data.frame(STUDENT=c(1,2,3),
A=c(1,1,1),
B=c(1,1,0),
C=c(0,1,1),
TOT=c(2,3,2),
TOT.NOT.A=c(1,2,1))

我有一個垂直數據並希望轉換為如上所示的水平數據。 我可以

WANT = HAVE %>% group_by(STUDENT) %>% mutate(TOT = n_distinct (TEST)) 

獲得“TOT”,但我不知道如何獲得“A”“B”“C”或“TOT.NOT.A”

我們可以使用pivot_wider重塑為“寬”格式並獲得“TOT”列

library(dplyr)
library(tidyr)
HAVE %>% 
  pivot_wider(names_from = TEST, values_from = TEST,
     values_fn = length, values_fill = 0) %>% 
  mutate(TOT = rowSums(across(-STUDENT), na.rm = TRUE),
   TOT_NOT_A = rowSums(across(B:C), na.rm = TRUE))

-輸出

# A tibble: 3 × 6
  STUDENT     A     B     C   TOT TOT_NOT_A
    <dbl> <int> <int> <int> <dbl>     <dbl>
1       1     1     1     0     2         1
2       2     1     1     1     3         2
3       3     1     0     1     2         1

或使用base R

out <- addmargins(table(HAVE), 2)
cbind(out, TOT_NOT_A = rowSums(out[, c("B", "C")]))
  A B C Sum TOT_NOT_A
1 1 1 0   2         1
2 1 1 1   3         2
3 1 0 1   2         1

這是一種將rowwisec_acrosssum相結合的替代方法:

library(dplyr)

HAVE %>% 
  add_count(STUDENT, TEST) %>% 
  pivot_wider(names_from = TEST, values_from =n, values_fill = 0 ) %>% 
  rowwise() %>% 
  mutate(TOT = sum(c_across(A:C), na.rm = TRUE),
         TOT_NOT_A = sum(c_across(B:C), na.rm = TRUE))
 STUDENT     A     B     C   TOT TOT_NOT_A
    <dbl> <int> <int> <int> <int>     <int>
1       1     1     1     0     2         1
2       2     1     1     1     3         2
3       3     1     0     1     2         1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM