使用group_by和subset命令进行组计算

时间:2017-09-30 18:26:11

标签: r group-by subset

我是一名新手STATA用户试图跳转到R.我正在进行各种练习,但是在group_by和subset命令中出现了问题。

我有一个简单的数据集,我希望进行基于组的计算。我正在尝试使用dplyr包中的groups_by命令来执行此操作。

我的数据集叫做痒,由4个变量组成:
治疗水平A和B(治疗类型)
类型 - 黑暗和公平(肤色)
y - 0级和1级(治疗失败或成功)
freq - 表示此特定组中有多少的数值变量

使用此代码可以重新创建它:

type <- c(2,2,2,2,1,1,1,1)
treat <-c(1,1,2,2,1,1,2,2)
y <- c(1,0,1,0,1,0,1,0)
freq <- c(9,17,5,20,10,15,3,20)
itchy <- cbind.data.frame(type,treat,y,freq)
itchy$type <- as.factor(type)
itchy$type <- factor(itchy$type,levels = c(1,2), labels = c("Dark", "Fair"))
itchy$treat <- as.factor(treat)
itchy$treat <- factor(itchy$treat,levels = c(1,2), labels = c("A", "B"))
itchy$y <- as.factor(y)
itchy$y <- factor(itchy$y,levels = c(0,1), labels = c("failure", "succes"))

现在我想计算治疗A和B成功应用于皮肤类型Dark或Fair的成功率。 (ods = nr成功事件/ nr失败)

我有两个问题:

1)你能帮我按小组进行计算吗? 2)我尝试过group_by和subset的各种组合,没有任何运气。下面的代码显示了我的一些不成功的尝试。那么你可以告诉我对group_by和subset命令如何工作有一个基本的误解

itchy %>% group_by(treat, type) %>% summarize(ods = (subset(freq, y==1)/subset(freq, y==0)))

itchy %>% group_by(treat, type) %>% ods <- c((subset(freq, y==1)/subset(freq, y==0)))

itchy %>% group_by(treat, type) %>% itchy$ods <- (subset(freq, y==1)/subset(freq, y==0))

2 个答案:

答案 0 :(得分:1)

junk = itchy %>% group_by(y,treat, type) %>% summarize(Overall = sum(freq))
myfunc = function(arg1,arg2){
  filter(junk,treat == arg1,type == arg2)[1,4]/filter(junk,treat == arg1,type == arg2)[2,4]
}

myfunc("A","Dark") # You can try all the various combinations here

这会给你带来理想的结果吗?

答案 1 :(得分:1)

如果我理解正确,我认为以下内容可行。我使用了tidyr包中的spread函数,就像dplyr是tidyverse

的一部分一样


library(tidyr)
itchy %>% 
  spread(y, freq) %>% 
  mutate(odds = succes / failure)

  type treat failure succes      odds
1 Dark     A      15     10 0.6666667
2 Dark     B      20      3 0.1500000
3 Fair     A      17      9 0.5294118
4 Fair     B      20      5 0.2500000