我可以根据 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 和您的新列,并使用... %&gt;% 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?谢谢 您可以使用cutlabels 参数来指定您想要的标签。有关详细信息,请参阅帮助页面 ?cut。要将日期转换为列,请查看FAQ on transforming data from long to wide。一种选择是添加到我的代码末尾... %&gt;% reshape2::dcast(herd + glicose_group ~ date, value.var = "n") 非常感谢格雷戈尔!你帮了我很多!

以上是关于我可以根据 r 中的其他两个条件创建一个变量的多个类别吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据R中的条件创建新变量

R(dplyr)中复位的条件运行计数(累计和)

将条件变量添加到 R 中的随机森林模型

在 R 中使用带有多个参数的匿名函数

根据 R Shiny 中的其他选择动态更新两个 selectInput 框

拆分 XMLTYPE 以根据条件创建两个 XMLTYPE