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が「temp」と呼ばれていると仮定して、次を使用します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、集約するときに簡単に使用できます。


そして、完全を期すための「整頓された」ソリューションを追加するには、次のようにします。

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の質問をStackOverflowに投稿するときに使用する必要があります。

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

プライヤー:

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

data.table を使用:

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

プライヤー付き:

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