我有三个变量的数据集:病假天数,年龄和性别。
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 解决问题有任何建议吗?
谢谢。
答案 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)
答案 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()
输出是:
答案 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")