web-dev-qa-db-ja.com

同じファクターでのカウントおよび条件付き集計関数の要約

簡単に言えば、カウントと集計関数を同じ要因の条件で要約するのに問題があります。

このデータフレームがあるとします:

library(dplyr)

df = tbl_df(data.frame(
    company=c("Acme", "Meca", "Emca", "Acme", "Meca", "Emca"), 
    year=c("2011", "2010", "2009", "2011", "2010", "2013"), 
    product=c("Wrench", "Hammer", "Sonic Screwdriver", "Fairy Dust", 
              "Kindness", "Helping Hand"), 
    price=c("5.67", "7.12", "12.99", "10.99", NA, FALSE)))

(本質的に)このデータフレームを作成します:

   company year  product             price
1    Acme  2011  Wrench              5.67
2    Meca  2010  Hammer              7.12
3    Emca  2009  Sonic Screwdriver   12.99
4    Acme  2011  Fairy Dust          10.99
5    Meca  2010  Kindness            NA
...  ...   ...   ...                 ...
n    Emca  2013  Helping Hand        FALSE

df <- group_by(df, company, year, product)にして、次の情報をすべて1つのコレクション(つまり、データフレーム)で取得するとします。

  1. 各価格リストの数(NA、Falseを含む)
  2. 「NA」状態のそれぞれの数
  3. NAおよびFalseを除く平均価格
  4. 最高価格

    summarize(df, count = n()) #satisfies first item obviously
    

他の人を取得しようとして問題があります。パイプ演算子を使用する必要があると思いますか?もしそうなら、誰でもいくつかのガイダンスを提供できますか?

これは私が試したものであり、明らかに間違っていますが、次にどこに行くべきかわかりません:

 summarize(df,
           total.count = n(),
           count = filter(df, is.na(price)),
           avg.price = filter(df, !is.na(price), price != FALSE),
           max.price = max(filter(df, !is.na(price), price != FALSE))

そして、はい、私はドキュメントをレビューしました、そして、答えはそこにあると確信しています、しかし、彼らは私の理解するためにあまりに高度かもしれません。前もって感謝します!

39
NewRRecruit

元のデータセットが作成したデータセットに似ていると仮定します(つまり、NAとしてcharacterを使用します。na.stringsを使用してデータを読み取り中にread.tableを指定できます。 NAは自動的に検出されます。

price列はfactorであり、numericクラスに変換する必要があります。 as.numericを使用すると、すべての非数値要素(つまり、"NA"、FALSE)がNAに強制され、警告が表示されます。

library(dplyr)
df %>%
     mutate(price=as.numeric(as.character(price))) %>%  
     group_by(company, year, product) %>%
     summarise(total.count=n(), 
               count=sum(is.na(price)), 
               avg.price=mean(price,na.rm=TRUE),
               max.price=max(price, na.rm=TRUE))

データ

表示されたのと同じdataset...行を除く)を使用しています。

df = tbl_df(data.frame(company=c("Acme", "Meca", "Emca", "Acme", "Meca","Emca"),
 year=c("2011", "2010", "2009", "2011", "2010", "2013"), product=c("Wrench", "Hammer",
 "Sonic Screwdriver", "Fairy Dust", "Kindness", "Helping Hand"), price=c("5.67",
 "7.12", "12.99", "10.99", "NA",FALSE)))
52
akrun