簡體   English   中英

R中的條件過濾和匯總

[英]Conditional filtering and summarizing in R

我最近從STATA + Excel過渡到R。因此,如果有人可以幫助我編寫高效的代碼,我將不勝感激。 在發布SO之前,我已經盡力研究了答案。

我的數據如下所示:

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),但函數顯示的精度更高。 例如,這是我從運行中得到的結果:

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

只是我跑的時候

abcd$mean[4]

我得到0.1031536697

方法2:使用dplyr我嘗試了管道和函數調用,但最終我放棄了。

方法2 | 嘗試1:心理:: describe(dplyr :: filter(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 | 嘗試2:使用管道:

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

這確實有效,我的意思是平均購買= 0.1031537。 但是,我仍然不確定嘗試1。

有什么想法為什么不起作用?

數據:

> 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

購買數量大於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

購買量大於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

如果不需要買家分組,

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

#   avg_no_buyers_gt_1
# 1          0.7777778

使用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() )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM