6

我有一个看似简单的问题,但我无法弄清楚如何得到我想要的。

我的数据如下所示:

      Job     C/C++     Java     Python
  Student     FALSE     TRUE      FALSE
Developer      TRUE     TRUE       TRUE
Developer      TRUE     TRUE      FALSE
 Sysadmin      TRUE    FALSE      FALSE
  Student     FALSE     TRUE       TRUE

我想按“工作”列分组并计算TRUE每列中的 s 数。我想要的输出如下所示:

      Job     C/C++     Java     Python
  Student         0        2          1
Developer         2        2          1 
 Sysadmin         1        0          0

任何帮助将不胜感激。

4

2 回答 2

9

假设您的 data.frame 被称为“临时”,只需使用aggregate

aggregate(. ~ Job, temp, sum)
#         Job C.C.. Java Python
# 1 Developer     2    2      1
# 2   Student     0    2      1
# 3  Sysadmin     1    0      0

逻辑是,TRUE等于FALSE“1”和“0”的数值,所以你可以sum在聚合时简单地使用。


并且,为了完整性添加“tidyverse”解决方案:

library(tidyverse)
temp %>% 
  group_by(Job) %>% 
  summarise_all(sum)
# # A tibble: 3 x 4
#   Job       C.C..  Java Python
#   <chr>     <int> <int>  <int>
# 1 Developer     2     2      1
# 2 Student       0     2      1
# 3 Sysadmin      1     0      0

这是您的数据格式,易于复制和粘贴。这是通过使用获得的,dput(your-actual-data-frame-name)并且是您将来在将 R 问题发布到 Stack Overflow 时应该使用的。

temp <- structure(list(Job = c("Student", "Developer", "Developer", "Sysadmin", 
          "Student"), C.C.. = c(FALSE, TRUE, TRUE, TRUE, FALSE), Java = c(TRUE, 
          TRUE, TRUE, FALSE, TRUE), Python = c(FALSE, TRUE, FALSE, FALSE, TRUE)),
          .Names = c("Job", "C.C..", "Java", "Python"), class = "data.frame", 
          row.names = c(NA, -5L))
于 2013-03-07T19:49:44.687 回答
7

替代方案plyrdata.table解决方案:

数据表:

require(data.table)
tmp.dt <- data.table(temp, key="Job")
tmp.dt[, lapply(.SD, sum), by=Job]

#         Job C.C.. Java Python
# 1: Developer     2    2      1
# 2:   Student     0    2      1
# 3:  Sysadmin     1    0      0

plyr:

require(plyr)
ddply(temp, .(Job), function(x) colSums(x[-1]))

#         Job C.C.. Java Python
# 1 Developer     2    2      1
# 2   Student     0    2      1
# 3  Sysadmin     1    0      0

编辑:如果不是 TRUE/FALSE,您必须计算Newbie's 的数量,然后:

使用数据表:

require(data.table)
tmp.dt <- data.table(temp, key="Job")
tmp.dt[, lapply(.SD, function(x) sum(x == "Newbie")), by=Job]

使用 plyr:

require(plyr)
ddply(temp, .(Job), function(x) colSums(x[-1] == "Newbie"))
于 2013-03-07T20:03:44.153 回答