我可以根据 r 中的其他两个条件创建一个变量的多个类别吗? [复制]
Posted
技术标签:
【中文标题】我可以根据 r 中的其他两个条件创建一个变量的多个类别吗? [复制]【英文标题】:Can I create many categories of one variable based in two other conditions in r? [duplicate] 【发布时间】:2019-08-12 00:55:08 【问题描述】:我正在 r 中的大数据框架(超过 48.000.000 行)中进行统计分析。以下是数据示例:
structure(list(herd = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), cows = c(1, 2,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16), `date` = c("11/03/2013",
"12/03/2013", "13/03/2013", "14/03/2013", "15/03/2013", "16/03/2013",
"13/05/2012", "14/05/2012", "15/05/2012", "16/05/2012", "17/05/2012",
"18/05/2012", "10/07/2016", "11/07/2016", "12/07/2016", "13/07/2016",
"11/03/2013", "12/03/2013", "13/03/2013", "14/03/2013", "15/03/2013",
"16/03/2013", "13/05/2012", "14/05/2012", "15/05/2012", "16/05/2012",
"17/05/2012", "18/05/2012", "10/07/2016", "11/07/2016", "12/07/2016",
"13/07/2016", "11/03/2013", "12/03/2013", "13/03/2013", "14/03/2013",
"15/03/2013", "16/03/2013", "13/05/2012", "14/05/2012", "15/05/2012",
"16/05/2012", "17/05/2012", "18/05/2012", "10/07/2016", "11/07/2016",
"12/07/2016", "13/07/2016"), glicose = c(240666, 23457789, 45688688,
679, 76564, 6574553, 78654, 546432, 76455643, 6876, 7645432,
876875, 98654, 453437, 98676, 9887554, 76543, 9775643, 986545,
240666, 23457789, 45688688, 679, 76564, 6574553, 78654, 546432,
76455643, 6876, 7645432, 876875, 98654, 453437, 98676, 9887554,
76543, 9775643, 986545, 240666, 23457789, 45688688, 679, 76564,
6574553, 78654, 546432, 76455643, 6876)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -48L))
我需要按牛群和日期确定有多少奶牛属于以下葡萄糖糖类别:
<=100000
100000 and <=150000
150000 and <=200000
200000 and <=250000
250000 and <=400000
>400000
我尝试使用函数filter()
和select()
,但无法对变量进行这样的分类。
我尝试为每个类别制作一个向量,但没有成功:
ht <- df %>% group_by(herd, date) %>%
filter(glicose < 100000)
实际上,我不知道如何做到这一点。请帮忙!
我希望根据表格中的每个日期获得每个牛群中每个类别的奶牛数量,如下所示:
【问题讨论】:
使用cut
添加包含您想要的分组的列,100000 到 150000、150000 到 200000 等。See this FAQ for examples。然后,您可以group_by
herd、date 和您的新列,并使用... %>% count()
进行计数
不一样的camille,因为我有两个条件可以申请。
哪两个条件?使用cut
创建一个分箱变量,然后按日期分组
你建议的问题只是想在一个列中计数。我想根据牛群和日期(一种情况)和不同的时间间隔(另一种情况)来计算。抱歉,但我不知道如何用 cut 创建一个 binned 变量,然后按日期和那个 bin 分组,你能告诉我吗?
【参考方案1】:
调用你的数据df
,
df %>%
mutate(glicose_group = cut(glicose, breaks = c(0, seq(1e5, 2.5e5, by = 0.5e5), 4e5, Inf)),
date = as.Date(date, format = "%d/%m/%Y")) %>%
group_by(herd, date, glicose_group) %>%
count
# # A tibble: 48 x 4
# # Groups: herd, date, glicose_group [48]
# herd date glicose_group n
# <dbl> <date> <fct> <int>
# 1 1 2012-05-13 (0,1e+05] 1
# 2 1 2012-05-14 (4e+05,Inf] 1
# 3 1 2012-05-15 (4e+05,Inf] 1
# 4 1 2012-05-16 (0,1e+05] 1
# 5 1 2012-05-17 (4e+05,Inf] 1
# 6 1 2012-05-18 (4e+05,Inf] 1
# 7 1 2013-03-11 (2e+05,2.5e+05] 1
# 8 1 2013-03-12 (4e+05,Inf] 1
# 9 1 2013-03-13 (4e+05,Inf] 1
# 10 1 2013-03-14 (0,1e+05] 1
# # ... with 38 more rows
我还加入了对Date
类的转换,这可能是个好主意。
【讨论】:
非常感谢!它起作用了,但我收到了这个警告:``` 1:因子glicose_group
包含隐式NA,考虑使用forcats::fct_explicit_na
2:因子glicose_group
包含隐式NA,考虑使用forcats::fct_explicit_na
``` 另一个问题,有吗一种创建 data.frame 的方法会产生如下表格: herd glicose_group 2012-05-13 2012-05-14 1
抱歉,我无法保留我在上一条评论中所指的表格格式。我会把它放在问题中。如果不允许这样做,我很抱歉。
另一个疑问,我怎样才能在结果中保留这样的数字 100000、1500000、200000 ...而不是像这样的 1e+05?谢谢
您可以使用cut
的labels
参数来指定您想要的标签。有关详细信息,请参阅帮助页面 ?cut
。要将日期转换为列,请查看FAQ on transforming data from long to wide。一种选择是添加到我的代码末尾... %>% reshape2::dcast(herd + glicose_group ~ date, value.var = "n")
非常感谢格雷戈尔!你帮了我很多!以上是关于我可以根据 r 中的其他两个条件创建一个变量的多个类别吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章