复合过滤R.

时间:2018-04-20 19:41:04

标签: r dplyr

我有三个变量的数据集:病假天数,年龄和性别。

declare @table table
(
 id int
 ,PhoneNr nvarchar(18)
 )
 insert into @table
 values(1,'(123) 4567')
 ,(2,'123, 4567')
 ,(3,'123 4567')
 ,(4,'123 - 4567');

;with t1 as
(
    select PhoneNr, id from @table
    union all
    select cast(replace(PhoneNr, substring(PhoneNr, PatIndex('%[^a-z0-9]%', PhoneNr), 1), '') as nvarchar(18)), id
    from t1
    where PatIndex('%[^a-z0-9]%', PhoneNr) > 0
)
select t1.PhoneNr from t1
 where PatIndex('%[^a-z0-9]%', t1.PhoneNr) = 0
option (maxrecursion 0)

目的是绘制条形图,以证明35岁以上的人数比一年35岁以下的人更多地错过一年超过2个工作日。

我很容易使用传统方法进行过滤:

       Sick days     Age  Gender
    1           5      39   F
    2           4      54   М
    3           5      42   М
    4           4      38   М
   ...

但是我想使用 dplyr 来获得更优雅的解决方案而且我已经陷入困境。我不明白如何在不使用汇总的情况下计算过滤行数。

这是我如何通过Gender进行另一次过滤的示例。我想得到类似的东西。

> data2<- subset(data, Sick.days>2) 
> sum(data2$Age > 35)
  [1] 115
> sum(data2$Age <= 35)
  [1] 36

您对如何使用 dplyr 解决问题有任何建议吗?

谢谢。

4 个答案:

答案 0 :(得分:1)

这样的事,也许吧?

library(tidyverse)

df = data.frame(sick_days = c(5,4,5,4,4,1),
                age = c(39,54,42,38,25,36),
                gender = c("F","M","M","M","F", "M"))

df = df %>%
  filter(sick_days > 2) %>%
  mutate(age_grp = ifelse(age > 35, ">35", "<=35"))

plot = ggplot(df) +
  geom_bar(aes(x=age_grp))

print(plot)

enter image description here

答案 1 :(得分:0)

不知道如何使用一组Null&lt; 35来解决这个问题。 Age Variable列中的所有观察结果均> 35。我会考虑使用双表动词Set操作。设置操作,将数据集中的观察结果组合起来,就好像它们是设置元素一样。 table1 ==&lt; 35 table2 ==&gt; 35。希望这可以帮助。 保罗

答案 2 :(得分:0)

summarise方法效率更高,只需在age_group内生成新的pipe变量即可。我使用了那些数据:

library(tidyverse)
df <- read_table("Sick_days     Age      Gender
  5           39        F
  4           54        М
  5           42        М
  4           38        М
  4           23        F")

代码:

df %>% 
   mutate(age_group=case_when(Age >=35 ~ ">=35",
                              Age <35 ~ "<35")) %>%    # here you define a new variable
   filter(Sick_days>=2) %>%
   group_by(age_group) %>%
   summarise(sum_sick=sum(Sick_days)) %>%
   ungroup() %>%
   ggplot(aes(age_group, sum_sick)) +
   geom_bar(stat = "identity") +
   theme_bw()

输出是:

enter image description here

答案 3 :(得分:0)

从方法论的角度来看,您可能需要考虑在过滤之前报告病假日期<2的数据。由于我刚刚完成向CRAN的提交,你可能还想看一下我写的小PlotXTabs函数,它会给你带有鼠标标记等的情节。所以......

require(dplyr)
require(CGPfunctions)
df <- data.frame(sick_days = c(5,4,5,4,4,1),
               age = c(39,54,42,38,25,36),
               gender = c("F","M","M","M","F", "M"))

df <- df %>%
         mutate(age_grp = ifelse(age > 35, ">35", "<=35"),
                sick_grp = ifelse(sick_days > 2, ">2", "<=2"))

PlotXTabs(df,sick_grp,age_grp)
PlotXTabs(df,sick_grp,age_grp,"percent")
PlotXTabs(df,sick_grp,age_grp,"stack")

first example only