R 需要数据框中高级分组和数据操作的帮助吗
因此,我有以下数据集:R 需要数据框中高级分组和数据操作的帮助吗,r,dataframe,R,Dataframe,因此,我有以下数据集: Employee EducLev JobGrade YrsExper Age Gender YrsPrior PCJob Salary 1 3 1 3 26 Male 1 No 32000 2 1 1 14 38 Female 1 No 39100 3 1 1 12 35 Female 0 No 33200 4 2 1 8 40 Female 7
Employee EducLev JobGrade YrsExper Age Gender YrsPrior PCJob Salary
1 3 1 3 26 Male 1 No 32000
2 1 1 14 38 Female 1 No 39100
3 1 1 12 35 Female 0 No 33200
4 2 1 8 40 Female 7 No 30600
5 3 1 3 28 Male 0 No 29000
6 3 2 3 24 Female 0 No 30500
7 3 2 4 27 Female 0 No 30000
8 3 2 8 33 Male 2 No 27000
9 1 3 4 62 Female 0 No 34000
10 3 3 9 31 Female 0 No 29500
11 3 4 9 34 Female 2 No 26800
12 2 5 8 37 Female 8 No 31300
13 2 5 9 37 Female 0 No 31200
14 2 6 10 58 Female 6 No 34700
15 3 6 4 33 Female 0 No 30000
16 3 6 3 27 Female 0 No 31000
我需要这样的输出:
JobGrade Female Male Total
1 34.29% 17.65% 28.85%
2 20.71% 19.12% 20.19%
3 25.71% 10.29% 20.67%
4 12.14% 16.18% 13.46%
5 6.43% 17.65% 10.10%
6 0.71% 19.12% 6.73%
我看过其他一些使用聚合函数的帖子。我不能在这种情况下使用它。有人能帮我得到这样的输出吗?
附言:我不想通过计算所有的百分比然后创建一个新的数据集来做到这一点
我自己用下面的代码来解决这个问题。但我认为这不是解决这个问题的正确方法
df = data.frame(jobgrade=numeric(), gmale=numeric(), gfemale=numeric(), total=numeric())
for(i in 1:6)
{
df[i,]=c(i, nrow(bsal[bsal$Gender=="Male"&bsal$JobGrade==i,]) * 100 / nrow(bsal[bsal$JobGrade==i,]),
nrow(bsal[bsal$Gender=="Female"& bsal$JobGrade==i,]) * 100 / nrow(bsal[bsal$JobGrade==i,]),
nrow(bsal[bsal$JobGrade==i,]) * 100/nrow(bsal))
}
您可以通过
aggregate
实现这一点。假设您的data.frame名为df。这个方法首先创建一个填充了一个的列,我在下面将它命名为dumm。您可以避免此步骤,然后再执行它
df$dumm <- 1
results <- aggregate(cbind("Female"=df$Gender == "Female",
"Male"=df$Gender == "Male",
"total"=df$dumm),
by=list(df$JobGrade), fun=sum)
这里是另一个使用
data.table
和dcast
的选项。我们将'data.frame'转换为'data.table'(setDT(df1)
),转换为'wide'格式,指定fun.aggregate
为length
,通过
上的'JobGrade'数据集将
的汇总计数与合并,分配(:=/code>)将列2:4与“总计”的sum
相除得到的输出进行比较
library(data.table)
dcast(setDT(df1), JobGrade~Gender, value.var= "Gender", length)[df1[
, .(Total=.N) ,.(JobGrade)], on = "JobGrade"][, (2:4) := lapply(.SD, `/`,
sum(Total)), .SDcols = 2:4][]
这也可以使用base R
compact选项来完成
t1 <- addmargins(table(df1[c("JobGrade", "Gender")]), 2)
t1/sum(t1[,'Sum'])
t1请阅读如何操作的信息。嘿,谢谢你编辑我的帖子。我想知道如何正确格式化,现在你知道了;-)试着写一些代码,如果你遇到问题,问一个问题,包括描述中的代码。正如您所说的,尝试使用聚合函数的方法,然后询问您在这种情况下遇到的问题。谢谢您的回答。我现在得到数据集中的男性和女性人数。我可以通过将所有值除以总数得到百分比。你能解释一下你用df$dumm做了什么吗?我在我的答案中添加了一些要点,希望这些会有帮助。是的,现在我明白了。谢谢我自己用了一种非常粗糙的方法来做这件事,我已经把它包括在OP中了
library(data.table)
dcast(setDT(df1), JobGrade~Gender, value.var= "Gender", length)[df1[
, .(Total=.N) ,.(JobGrade)], on = "JobGrade"][, (2:4) := lapply(.SD, `/`,
sum(Total)), .SDcols = 2:4][]
t1 <- addmargins(table(df1[c("JobGrade", "Gender")]), 2)
t1/sum(t1[,'Sum'])