2016-07-31 81 views
0

私は最近STATA + ExcelからRに移行しました。効率的なコードを書いてくれたら助かります。私はSOに投稿する前に答えを研究するために最善を尽くしました。だから、ここで私がやったことだ条件付きフィルタリングと要約R

mydata<-data.frame(sassign$buyer,sassign$purch,sassign$total_) 
str(mydata) 
'data.frame': 50000 obs. of 3 variables: 
$ sassign.buyer : Factor w/ 2 levels "no","yes": 1 1 1 1 1 2 1 1 2 1 ... 
$ sassign.purch : num 10 3 2 1 1 1 1 11 11 1 ... 
$ sassign.total_: num 357 138 172 272 149 113 15 238 418 123 ... 
head(mydata) 
    sassign.buyer sassign.purch sassign.total_ 
1   no   10   357 
2   no    3   138 
3   no    2   172 
4   no    1   272 
5   no    1   149 
6   yes    1   113 

私の目標は、購入> 1.

の#と買い手の平均数を見つけることです:

はここのように私のデータがどのように見えるかだ

方法1:ロングメソッド

library(psych) 
check<-as.numeric(mydata$sassign.buyer)-1 
myd<-cbind(mydata,check) 
abcd<-psych::describe(myd[myd$sassign.purch>1,]) 
abcd$mean[4] 

私が得た出力は0.1031536697であり、正しいです。

@Sathish:ここではチェックがどのように見えるかです:

head(check) 
0 0 0 0 0 1 

これが私の目的を解決しました。

この方法の長所:簡単で、通常は初心者レベルです。 短所:多すぎる - 余分な変数(チェック)が必要です。さらに、私はこの方法が嫌いです。それはあまりにも厄介です。

質問:デフォルトでは、オプション(数字= 10)が設定されていても、関数の精度は高くなりません。私はパイプや関数呼び出しを試してみました dplyr使用:私は0.1031536697

方法2を得た

abcd$mean[4] 

実行したときにそれだけだ

psych::describe(myd[myd$sassign.purch>1,]) 


       vars  n mean  sd median trimmed mad min max range skew 
sassign.buyer* 1 34880 1.10 0.30  1 1.00 0.00 1 2  1 2.61 
sassign.purch  2 34880 5.14 3.48  4 4.73 2.97 2 12 10 0.65 
sassign.total_ 3 34880 227.40 101.12 228 226.13 112.68 30 479 449 0.09 
check    4 34880 0.10 0.30  0 0.00 0.00 0 1  1 2.61 
       kurtosis se 
sassign.buyer*  4.81 0.00 
sassign.purch  -1.05 0.02 
sassign.total_ -0.72 0.54 
check    4.81 0.00 

:たとえば、ここで私はランニングからもらったものです私はついに諦めました。

方法2 | Try1: 心理::記述(dplyr ::フィルタ(MYDATA、MYDATA $ sassign.purch> 1)、dplyr ::のmutate(as.numeric(MYDATA $ sassign.buyer)-1)])

出力:

Error in UseMethod("mutate_") : 
    no applicable method for 'mutate_' applied to an object of class "c('double', 'numeric')" 

方法2 | Try2:使用パイプ:

mydata %>% mutate(newcol = as.numeric(sassign.buyer)-1) %>% dplyr::filter(sassign.purch>1) %>% summarise(meanpurch = mean(newcol)) 

はこれが仕事をした、と私はmeanpurch = 0.1031537を得ました。しかし、私は試してみるのがまだ分かりません。

これはなぜ機能していないのでしょうか?

+0

[この投稿を再現可能にする](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を試してください。 – shayaa

+0

Shayaa - 私はコードを編集しました。これが今再現可能であることを願っています。私に教えてください... – watchtower

+1

Sathish、あなたの返事をありがとう。私はhead(チェック)の出力を投稿しました。ご質問がある場合はお知らせください。 – watchtower

答えて

2

のデータ:1

dt %>% 
    group_by(sassign.buyer) %>% 
    filter(sassign.purch > 1) %>% 
    summarise(avg_no_buyers_gt_1 = length(sassign.buyer)/ nrow(dt)) 

# Source: local data frame [1 x 2] 
# 
#  sassign.buyer avg_no_buyers_gt_1 
#   (chr)    (dbl) 
# 1   no    0.5 

よりも大きいの購入と買い手の1

library(dplyr) 

dt %>% 
    group_by(sassign.buyer) %>% 
    filter(sassign.purch > 1) 

# 
# Source: local data frame [3 x 3] 
# Groups: sassign.buyer [1] 
# 
# sassign.buyer sassign.purch sassign.total_ 
# (chr)   (int)   (int) 
# 1   no   10   357 
# 2   no    3   138 
# 3   no    2   172 

の平均数よりも多くの購入と買い手の

> dt 
# sassign.buyer sassign.purch sassign.total_ 
# 1   no   10   357 
# 2   no    3   138 
# 3   no    2   172 
# 4   no    1   272 
# 5   no    1   149 
# 6   yes    1   113 

数バイヤーのないグループ分けがされていない場合必要、

dt %>% 
    filter(sassign.purch > 1) %>% 
    summarise(avg_no_buyers_gt_1 = length(sassign.buyer)/ nrow(dt)) 

# avg_no_buyers_gt_1 
# 1   0.7777778 
+1

こんにちはSathishさん、ご協力ありがとうございます。しかし、mydata%>%filter(mydata $ sassign.purch> 1)%>%summary%avg_no_buyers_gt_1 = length(sassign.buyer)/ nrow(mydata ")、)エラーが表示されます:" UseMethod( "summarise_")のエラー: 'c(' mts '、' ts ')のオブジェクトに' summarise_ 'の適用可能なメソッドが適用されません。 – watchtower

+0

グループ化せずに試したときにエラーが発生しましたmydataのデータフレームを使用していますあなたの助けに感謝しますあなたのスクリーンショットにコメントを追加しました – watchtower

+1

試してみてください: 'mydata%>%filter – Sathish

2

mean()で条件に合った症例の割合を求めるのは簡単です。 https://drsimonj.svbtle.com/proportionsfrequencies-with-mean-and-booleans、ここで簡単な例を示します:ここでそれを説明するブログ記事です

buyer <- c("yes", "yes", "no", "no") 
mean(buyer == "yes") 
#> [1] 0.5 

だからあなたの場合には、あなたがmean(d$sassign.buyer[d$sassign.purch > 1] == "yes")を行うことができます。ここで働いていた例は次のとおり

d <- data.frame(
    sassign.buyer = factor(c("yes", "yes", "no", "no")), 
    sassign.purch = c(1, 10, 0, 200) 
) 
mean(d$sassign.buyer[d$sassign.purch > 1] == "yes") 
#> [1] 0.5 

これはd$sassign.purchハン1大きいすべてのケースを取得し、次いでd$sassign.buyer"yes"に等しくなっているこれらのケースの(使用mean())比率を計算します。

+0

独創的なコマンドです。これは最高です。ありがとうサイモン! – watchtower

+0

サイモン、助けてくれてありがとう。私はdplyrメソッドを探していたので、答えとしてSathishの応答をマークしました。私はあなたの方法が好きです。なぜなら、それは非常に高速で効率的だからです。あなたが気にしないことを願っています。私はあなたに知らせることを考えました。私はあなたのブログにも行きます。これまでのところ、それは素晴らしいです! – watchtower

+1

ありがとう、@ watchtower。もちろん、サシッシュの反応は良いです。 mean()を使うことを示唆するコメントを1つ追加します。そしてblogRのフィードバックをありがとう! –