计数值在组 R 中出现的次数
Posted
技术标签:
【中文标题】计数值在组 R 中出现的次数【英文标题】:Count number of times a value occurs within a group R 【发布时间】:2021-12-29 21:10:36 【问题描述】:我的数据样本如下:
id = c(1, 2, 3, 4, 5, 1, 4, 7, 8, 3)
date = c("2020-12-31", "2020-12-31", "2020-12-31", "2020-12-31",
"2020-12-31", "01-01-2021", "01-01-2021", "01-01-2021", "01-01-2021",
"01-01-2021")
total = c(1, 4, 4, 15, 0, 12, 1, 1, 1, 0)
data = data.frame(id, date, total)
我正在尝试计算每个日期出现“总”值的次数。例如,对于日期"2020-12-31"
,值4
出现两次,但值1
只出现一次,因为它在该日期出现15
和0
。然后对于日期"01-01-2021"
,值1
出现三次,依此类推。本质上,我希望 out 导致:
day = c("2020-12-31", "01-01-2021")
one = c(1, 3)
two = c(0, 0)
three = c(0, 0)
four = c(2, 0)
five = c( 0, 0)
six = c(0, 0)
seven = c(0,0)
eight = c(0, 0)
nine = c(0,0)
ten = c(0,0)
eleven = c(0,0)
twelve = c(0,1)
thirteen = c(0,0)
fourteen = c(0,0)
fifteen = c(1,0)
df = data.frame(day, one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen,
fourteen, fifteen)
所以一列代表日期,接下来的 15 列代表我正在计算的数字。 (我的数据还有更多日期,我只是没有把它们都放在我的例子中)
我首先将原始列按以下方式分组:
data %>%
group_by(date, total)
但我不确定如何计算每组的值并将其放入结果数据框中。谢谢!
【问题讨论】:
你有错误的第三个参数,我认为它必须是“total”,因为没有count
attr
是的,抱歉,刚刚修好了
【参考方案1】:
library(tidyr)
library(dplyr)
data %>%
count(date, total) %>%
complete(date, total = 0:15, fill = list(n = 0)) %>%
pivot_wider(id_cols = date, names_from = total, values_from = n, names_prefix = "total")
# # A tibble: 2 × 17
# date total0 total1 total2 total3 total4 total5 total6 total7 total8 total9 total10 total11 total12
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 01-01… 1 3 0 0 0 0 0 0 0 0 0 0 1
# 2 2020-… 1 1 0 0 2 0 0 0 0 0 0 0 0
# # … with 3 more variables: total13 <dbl>, total14 <dbl>, total15 <dbl>
【讨论】:
我收到错误Error: wt_var must be a single variable
使用dplyr::count(date, total)
而不是count(date, total)
。您可能有“另一个名为 count 的函数正在屏蔽 dplyr 的版本。”见***.com/questions/55305380/…
我收到此错误Error: Must group by variables found in `.data`. * Column `date` is not found. * Column `total` is not found.
我应该在 count() 之前执行 group_by(date) 吗?
将date
放入count
应该可以解决这个问题。我在您的示例数据上测试了代码,不确定有什么不同...【参考方案2】:
`as.data.frame.table 是老生常谈的方法:
as.data.frame( with(data, table(date, total)))
#------------------------
date total Freq
1 01-01-2021 0 1
2 2020-12-31 0 1
3 01-01-2021 1 3
4 2020-12-31 1 1
5 01-01-2021 4 0
6 2020-12-31 4 2
7 01-01-2021 12 1
8 2020-12-31 12 0
9 01-01-2021 15 0
10 2020-12-31 15 1
如果您希望它采用“宽”格式,这确实是一个 b*tch 的工作,然后将其保留为 tble:
with(data, table(date, total))
total
date 0 1 4 12 15
01-01-2021 1 3 0 1 0
2020-12-31 1 1 2 0 1
【讨论】:
当我执行第二个代码块时,我收到错误Error in table(date, total) : object 'total' not found
当您使用“with”时,可以不带引号引用列名。我正在使用您的示例。如果你得到不同的结果,你需要提供一个minimal reproducible example以上是关于计数值在组 R 中出现的次数的主要内容,如果未能解决你的问题,请参考以下文章
如何计算某些值在 SQL 表中出现的次数并在列中返回该数字?