我有一个很长的数据集,每个人有一行与学校分组。每行都有一个有序因子{1,2,3,4},"猫"。我希望得到每所学校中1,2,3,3和4的百分比。数据集如下所示:
school_number cats
1 10505 3
2 10505 3
3 10502 1
4 10502 1
5 10502 2
6 10502 1
7 10502 1
8 10502 2
10 10503 3
11 10505 2
我试过这样的事情:
df_pcts <- df %>%
group_by(school_number) %>%
mutate(total=sum(table(cats))) %>%
summarize(cat_pct = table(cats)/total)
但是mutate()步骤产生的总变量会在每一行中显示总行数。我甚至无法进入最后的总结步骤。我很困惑。
P.S。在其他一些帖子中,我看到这样的行:
n = n()
当我这样做时,我收到一条消息说,
Error in n() : This function should not be called directly
这是从哪里来的?
TIA
答案 0 :(得分:9)
也许这有点帮助,虽然我不能100%确定你需要什么输出。
使用tally
计算df中存在的每个school_number / cats组合的行数。然后计算每个school_number中'cats'的百分比,然后只按school_number分组。
df %>%
group_by(school_number,cats) %>%
tally %>%
group_by(school_number) %>%
mutate(pct=(100*n)/sum(n))
它给出了这个:
# school_number cats n pct
# 1 10502 1 4 66.66667
# 2 10502 2 2 33.33333
# 3 10503 3 1 100.00000
# 4 10505 2 1 33.33333
# 5 10505 3 2 66.66667
编辑:
要添加样本数据中缺少0%的行,您可以执行以下操作。将上面的输出与所有school_number / cats组合中包含0%的df绑定在一起。仅保留此绑定的第一个实例(如果存在,则第一个实例始终包含值&gt; 0%)。然后我通过school_number和猫安排它以便于阅读:
y<-df %>%
group_by(school_number,cats) %>%
tally %>%
group_by(school_number) %>%
mutate(pct=(100*n)/sum(n)) %>%
select(-n)
x<-data.frame(school_number=rep(unique(df$school_number),each=4), cats=1:4,pct=0)
rbind(y,x) %>%
group_by(school_number,cats)%>%
filter(row_number() == 1) %>%
arrange(school_number,cats)
给出:
# school_number cats pct
#1 10502 1 66.66667
#2 10502 2 33.33333
#3 10502 3 0.00000
#4 10502 4 0.00000
#5 10503 1 0.00000
#6 10503 2 0.00000
#7 10503 3 100.00000
#8 10503 4 0.00000
#9 10505 1 0.00000
#10 10505 2 33.33333
#11 10505 3 66.66667
#12 10505 4 0.00000
答案 1 :(得分:0)
学校编号和猫的所有组合然后离开加入以计算pct。如果NA则为0
expand.grid(school_number = unique(df$school_number), cats = levels(df$cats)) %>%
left_join(df %>%
group_by(school_number, cats) %>%
tally %>%
mutate(pct = (n / sum(n) * 100))) %>%
select(-n) %>%
mutate(pct = ifelse(is.na(pct), 0, pct)) %>%
arrange(school_number)
给出了
school_number cats pct
1 10502 1 66.66667
2 10502 2 33.33333
3 10502 3 0.00000
4 10502 4 0.00000
5 10503 1 0.00000
6 10503 2 0.00000
7 10503 3 100.00000
8 10503 4 0.00000
9 10505 1 0.00000
10 10505 2 33.33333
11 10505 3 66.66667
12 10505 4 0.00000
答案 2 :(得分:0)
正如@akrun所建议的那样,您之前可能已经调用了self.ax.clear()
和plyr
个包。由于两个包中都有dplyr
个值,因此您可以通过在函数名称之前添加包来指定,即summaris(z)e
。