r - 需要数据框中高级分组和数据操作的帮助

标签 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   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%

我看过其他一些使用聚合函数的帖子。我无法在这种情况下使用它。谁能帮助我如何获得这样的输出? P.S:我不想通过计算所有百分比然后创建新的数据集来做到这一点。

我自己使用了以下代码来解决这个问题。但我认为这不是解决这个问题的正确方法。

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)

结果数据框包含男性、女性的计数以及按职位等级划分的总数。现在只需除以总数:

results <- results / sum(results$total)

第二种非常常见的方法是使用 data.table 包:

library(data.table)
setDT(df)

results <- df[, list("Female"=sum(Gender == "Female"), 
                               "Male"=sum(Gender == "Male"),
                               "total"=length(Gender)), 
              by=.(JobGrade)]
results <- df[, lapply(.SD, function(i) i / sum(total)), .SDcols=2:4]

关于r - 需要数据框中高级分组和数据操作的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37644033/

相关文章:

python - 将列表中元组形式的单行字符串拆分为多行(等于元组数)

r - 将 JSON 列添加到 R 数据框

python - 如何将打印精美的数据框读入 Pandas 数据框?

r - 更改 x/y 列而不编辑原始 ggplot 命令

r - 计算 R 中的尾随零

r - 在summary_if() 中使用其他列作为函数的参数

python - 在 Pandas 中将两个数据框列合并为 1

python - Pandas 根据另一列的子字符串中的数字从子字符串切片中创建新列

R:解析大型非结构化 xml 文件

r - 在 ggplot 中标记