我最近从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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句