簡體   English   中英

在r中的多列中計算0s 1s和2s

[英]Counting 0s 1s and 2s in multiple column in r

我的數據如下所示:

structure(list(did = c(209L, 209L, 206L, 206L, 206L, 206L, 206L, 
206L, 206L, 206L, 206L, 209L, 206L, 206L, 207L, 207L, 207L, 207L, 
209L, 209L), hhid = c(5668, 5595, 4724, 4756, 4856, 4730, 4757, 
6320, 4758, 6319, 6311, 5477, 6322, 6317, 134, 178, 238, 179, 
5865, 5875), bc = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 
1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L), rc = c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
    oap = c(2L, 2L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 2L, 2L, 0L, 2L, 
    2L, 2L, 2L, 2L, 2L, 0L, 0L)), row.names = c(NA, 20L), class = "data.frame")

hhid 對每一行都是唯一的。 對於剩余的行,它在某些列中由 0 和 1 組成,在其他列中由 0 和 1 和 2 組成。 所需的輸出列是這樣的:

did   hh_count   bc_0   bc_1  bc_2   rc_0  rc_1  rc_2  oap_0  oap_1  oap_2

其中 did 將是唯一的。hh_count 將是與 did 關聯的每個 hhid 的計數。 bc_0、bc_1 和 bc_1 將是 bc 列的分解,它將表示 bc 中 0s 1s 和 2s 的計數。對於 rc_0、rc_1 和 rc_2 以及 oap_0、oap_1 和 oap_2。因此需要對 0s 1s 和 2s 進行計數

對於 3 個特定值的計數,手動編寫函數似乎是合理的。 如果您需要更多不同值的特定計數,我們可以提出一種更好的概括方法 - 可能將您的數據轉換為長格式,匯總,然后返回寬格式。

library(dplyr)  # across() requires dplyr version 1.0 or higher
dd %>%          # (calling your data dd)
  group_by(did) %>%
  summarize(
    hh_count = n_distinct(hhid),
    across(c(bc, rc, oap),
           .fns = list("0" = ~sum(. == 0), "1" = ~sum(. == 1), "2" = ~sum(. == 2)),
           .names = "{.col}_{.fn}"  # this is the default, but I show it explicitly
           )
  )
# # A tibble: 3 x 11
#     did hh_count  bc_0  bc_1  bc_2  rc_0  rc_1  rc_2 oap_0 oap_1 oap_2
#   <int>    <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
# 1   206       11     2     9     0     2     9     0     6     0     5
# 2   207        4     0     4     0     0     4     0     0     0     4
# 3   209        5     2     3     0     0     5     0     3     0     2

暫無
暫無

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

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