R 在整齐的数据中取组间的一对多差异

R 在整齐的数据中取组间的一对多差异,r,tidyr,tidyverse,R,Tidyr,Tidyverse,我有一个整洁的数据集,类似于中的听力率示例,但我在药物下有一个额外的安慰剂组,我可以这样构造 library(dplyr) library(tidyr) messy <- data.frame( name = c("Wilbur", "Petunia", "Gregory"), a = c(67, 80, 64), b = c(56, 90, 50), p = c(60, 70, 60) # this is the new 'placebo' drug ) tidy

我有一个整洁的数据集,类似于中的听力率示例,但我在药物下有一个额外的安慰剂组,我可以这样构造

library(dplyr)
library(tidyr)
messy <- data.frame(
  name = c("Wilbur", "Petunia", "Gregory"),
  a = c(67, 80, 64),
  b = c(56, 90, 50),
  p = c(60, 70, 60)    # this is the new 'placebo' drug
)
tidy <- messy %>% 
        gather(drug, heartrate, a:p)
假设我从整洁的数据开始,我的目标是创建一个名为diff.p的新变量,它是每种药物和安慰剂的观察结果之间的差异。结果应该是这样的

tidy$diff.p <- c(7,10,4,-4,20,-10,0,0,0)
tidy

似乎ave和/或mutate可能是解决方案的好途径,或者可能是构建新的数据框架,但我需要一些关于最佳实践的额外指导

使用第二个tidy,您似乎可以相当轻松地做到这一点:


看起来你可以很容易地用第二个整洁的:

在dplyr链中,您可以通过按名称分组,然后从心率中减去心率[drug==p]来实现这一点:

在dplyr链中,您可以通过按名称分组,然后从心率中减去心率[drug==p]来实现这一点:

另一个选项是data.table

另一个选项是data.table


这正是我希望能够做到的,谢谢!这正是我希望能够做到的,谢谢!对于我提供的特定示例,这似乎是解决问题的一个非常好的方法,但是如果我从一个整洁的数据集开始,我将不得不扩展然后应用这个函数。此外,如果我需要比较药物a、b、c、d、e等等,它看起来不会有很大的规模。好吧,你的观点在技术上很突出,但你在问题中从未暗示你可能从整洁的数据开始。在你的问题中,你应该向我表明什么来做出这个假设?考虑到你的问题是从不整洁的数据开始的,你有什么迹象表明这将不能很好地扩展?这一点很好。我已经编辑了这个问题,这样将来的读者就不会感到困惑了。谢谢对于我提供的特定示例,这似乎是解决问题的一个非常好的方法,但是如果我从一个整洁的数据集开始,我将不得不扩展然后应用这个函数。此外,如果我需要比较药物a、b、c、d、e等等,它看起来不会有很大的规模。好吧,你的观点在技术上很突出,但你在问题中从未暗示你可能从整洁的数据开始。在你的问题中,你应该向我表明什么来做出这个假设?考虑到你的问题是从不整洁的数据开始的,你有什么迹象表明这将不能很好地扩展?这一点很好。我已经编辑了这个问题,这样将来的读者就不会感到困惑了。谢谢FWIW统计这不是一个好主意。在你的模型中加入p会更好。我对统计学不太了解,也许你可以给我指一些参考资料,详细说明你认为在你的模型中加入p更好是什么意思。谢谢在model.FWIW中包含p作为一个术语。从统计学上来说,这不是一个好主意。在你的模型中加入p会更好。我对统计学不太了解,也许你可以给我指一些参考资料,详细说明你认为在你的模型中加入p更好是什么意思。谢谢包括p作为模型中的一个术语。
tidy2 <- messy %>%
  mutate(a = a-p, b = b-p, p = 0) %>%
  gather(drug, diff.p, a:p)

left_join(tidy, tidy2, by = c("name", "drug"))
#      name drug heartrate diff.p
# 1  Wilbur    a        67      7
# 2 Petunia    a        80     10
# 3 Gregory    a        64      4
# 4  Wilbur    b        56     -4
# 5 Petunia    b        90     20
# 6 Gregory    b        50    -10
# 7  Wilbur    p        60      0
# 8 Petunia    p        70      0
# 9 Gregory    p        60      0
tidy = tidy %>% group_by(name) %>% 
  mutate(diff.p2 = heartrate - heartrate[drug=="p"])
     name  drug heartrate diff.p diff.p2
   <fctr> <chr>     <dbl>  <dbl>   <dbl>
1  Wilbur     a        67      7       7
2 Petunia     a        80     10      10
3 Gregory     a        64      4       4
4  Wilbur     b        56     -4      -4
5 Petunia     b        90     20      20
6 Gregory     b        50    -10     -10
7  Wilbur     p        60      0       0
8 Petunia     p        70      0       0
9 Gregory     p        60      0       0
library(data.table)
melt(setDT(messy), id.var = "name", variable.name = "drug", 
 value.name = "heartrate")[, diff.p2 := heartrate - heartrate[drug=="p"]][]
#      name drug heartrate diff.p2
#1:  Wilbur    a        67       7
#2: Petunia    a        80      10
#3: Gregory    a        64       4
#4:  Wilbur    b        56      -4
#5: Petunia    b        90      20
#6: Gregory    b        50     -10
#7:  Wilbur    p        60       0
#8: Petunia    p        70       0
#9: Gregory    p        60       0