计算R中各组内多次给药与对照的比值

mfuanj7w  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(162)

我有一个类似于以下示例的数据集,其中三个因子基本上是区组变量(Z,A和B),一个描述治疗的因子(X)和一个数字响应(Y)。在Z,A和B的每个组合中,我想计算X的每个水平与参考水平(X==“a”)相比的Y比率。

df<-data.frame(expand.grid(Z=c("Left","Right","Centre"),A=c("Yesterday","Tomorrow"),B=c("Rep1","Rep2"),X=c("a","b","c")))
set.seed(83)
df$Y<-sample(1:10,nrow(df),replace=T)

这个dplyr代码似乎可以实现:

ratios <- df %>%
  group_by(Z,A,B) %>% 
  reframe(ratio = Y/Y[X=="a"])
ratios

然而,我真的希望在那里有另一列,告诉我这个比率与X的哪个水平相关联,我不知道如何得到这个。
或者输出是否忠实于原始 Dataframe 的行顺序?(即使存在NA?)
(我试图用一个更大的数据集来做这件事,但有些东西不起作用-要么是行顺序发生了变化,要么是group_by的某些东西不起作用。令人恼火的是,我似乎无法用一个小的示例数据集来重现错误...)

uurv41yg

uurv41yg1#

你能描述一下你得到的错误吗?你可以做的第一个观察是,你的输出与原始 Dataframe 的行数完全一样,因为在这种情况下,你的reframe()相当于mutate() +排序。使用mutate(),你会自动保留X行:

df |> 
  group_by(Z, A, B) |>  
  mutate(ratio = Y / Y[X == "a"]) |> 
  arrange(Z, A, B)
#> # A tibble: 36 × 6
#> # Groups:   Z, A, B [12]
#>    Z     A         B     X         Y  ratio
#>    <fct> <fct>     <fct> <fct> <int>  <dbl>
#>  1 Left  Yesterday Rep1  a         1  1    
#>  2 Left  Yesterday Rep1  b        10 10    
#>  3 Left  Yesterday Rep1  c        10 10    
#>  4 Left  Yesterday Rep2  a         4  1    
#>  5 Left  Yesterday Rep2  b        10  2.5  
#>  6 Left  Yesterday Rep2  c         6  1.5  
#>  7 Left  Tomorrow  Rep1  a         9  1    
#>  8 Left  Tomorrow  Rep1  b         2  0.222
#>  9 Left  Tomorrow  Rep1  c         8  0.889
#> 10 Left  Tomorrow  Rep2  a         9  1    
#> # ℹ 26 more rows

相关问题