R 对所有组的分组操作,相对于;“基线”;分组,进行多次观察

R 对所有组的分组操作,相对于;“基线”;分组,进行多次观察,r,data.table,dplyr,R,Data.table,Dplyr,从包含每组多个观察值的数据开始,如下所示: set.seed(1) my.df <- data.frame( timepoint = rep(c(0, 1, 2), each= 3), counts = round(rnorm(9, 50, 10), 0) ) > my.df timepoint counts 1 0 44 2 0 52 3 0 42 4 1 66 5

从包含每组多个观察值的数据开始,如下所示:

set.seed(1)
my.df <- data.frame(
  timepoint = rep(c(0, 1, 2), each= 3),
  counts = round(rnorm(9, 50, 10), 0)
)
> my.df
  timepoint counts
1         0     44
2         0     52
3         0     42
4         1     66
5         1     53
6         1     42
7         2     55
8         2     57
9         2     56
我可以使用
dplyr
从该表中获得所需的输出:

library(dplyr)
my.df %>%
  group_by(timepoint) %>%
  mutate(rep = paste0("r", 1:n())) %>%
  left_join(x = ., y = filter(., timepoint == 0), by = "rep") %>%
  group_by(timepoint.x) %>%
  summarise(result = NonsenseFunction(counts.x, counts.y))
数据。表

library(data.table)
my.dt <- data.table(my.df)
my.dt[, rep := paste0("r", 1:length(counts)), by = timepoint]
merge(my.dt, my.dt[timepoint == 0], by = "rep", all = TRUE)[
  , NonsenseFunction(counts.x, counts.y), by = timepoint.x]
库(data.table)
my.dt你可以试试

library(dplyr)
my.df %>% 
    mutate(new = mean(counts[timepoint == 0])) %>% 
    group_by(timepoint) %>% 
    summarise(result = NonsenseFunction(counts, new))

# A tibble: 3 × 2
#  timepoint    result
#      <dbl>     <dbl>
#1         0 0.0000000
#2         1 0.1398601
#3         2 0.2097902
库(dplyr)
my.df%>%
变异(新=平均值(计数[时间点==0]))%>%
分组依据(时间点)%>%
总结(结果=无意义函数(计数,新))
#一个tibble:3×2
#时间点结果
#           
#1         0 0.0000000
#2         1 0.1398601
#3         2 0.2097902
您可以试试

library(dplyr)
my.df %>% 
    mutate(new = mean(counts[timepoint == 0])) %>% 
    group_by(timepoint) %>% 
    summarise(result = NonsenseFunction(counts, new))

# A tibble: 3 × 2
#  timepoint    result
#      <dbl>     <dbl>
#1         0 0.0000000
#2         1 0.1398601
#3         2 0.2097902
库(dplyr)
my.df%>%
变异(新=平均值(计数[时间点==0]))%>%
分组依据(时间点)%>%
总结(结果=无意义函数(计数,新))
#一个tibble:3×2
#时间点结果
#           
#1         0 0.0000000
#2         1 0.1398601
#3         2 0.2097902

以下是简单的data.table方法:

my.dt[, f(counts, my.dt[timepoint==0, counts]), by=timepoint]
这可能会一次又一次地为每个组获取
my.dt[timepoint==0,counts]
。您可以提前保存该值:

v = my.dt[timepoint==0, counts]
my.dt[, f(counts, v), by=timepoint]
。。。或者,如果您不想将
v
添加到环境中,可能

with(list(v = my.dt[timepoint==0, counts]), 
  my.dt[, f(counts, v), by=timepoint]
)

下面是简单的data.table方法:

my.dt[, f(counts, my.dt[timepoint==0, counts]), by=timepoint]
这可能会一次又一次地为每个组获取
my.dt[timepoint==0,counts]
。您可以提前保存该值:

v = my.dt[timepoint==0, counts]
my.dt[, f(counts, v), by=timepoint]
。。。或者,如果您不想将
v
添加到环境中,可能

with(list(v = my.dt[timepoint==0, counts]), 
  my.dt[, f(counts, v), by=timepoint]
)

您可以给出第二个参数,将感兴趣的组中的向量用作常数

my.df %>%
    group_by(timepoint) %>%
    mutate(response = NonsenseFunction(counts, my.df$counts[my.df$timepoint == 0]))
或者,如果您想提前完成:

constant = = my.df$counts[my.df$timepoint == 0]
my.df %>%
    group_by(timepoint) %>%
    mutate(response = NonsenseFunction(counts, constant))

您可以给出第二个参数,将感兴趣的组中的向量用作常数

my.df %>%
    group_by(timepoint) %>%
    mutate(response = NonsenseFunction(counts, my.df$counts[my.df$timepoint == 0]))
或者,如果您想提前完成:

constant = = my.df$counts[my.df$timepoint == 0]
my.df %>%
    group_by(timepoint) %>%
    mutate(response = NonsenseFunction(counts, constant))


请使用
set.seed()
在使用
rnorm
等函数创建数据帧时使用
。已编辑。这可能很明显,但是
my.df[,f(counts,my.df[timepoint==0,counts]),by=timepoint]
,其中
f
是您的函数。顺便说一句,我认为这是你最后一段导致混淆的代码(你希望它用于这个特定的函数,而不是更一般的情况)。@Frank谢谢你的评论,我已经编辑了这个问题。现在清楚了吗?您的
数据表
建议正是我想要的。很明显,你已经指出了这一点。想让它成为答案吗?请使用
set.seed()
在使用
rnorm
等函数创建数据帧时使用
。已编辑。这可能很明显,但是
my.df[,f(counts,my.df[timepoint==0,counts]),by=timepoint]
,其中
f
是您的函数。顺便说一句,我认为这是你最后一段导致混淆的代码(你希望它用于这个特定的函数,而不是更一般的情况)。@Frank谢谢你的评论,我已经编辑了这个问题。现在清楚了吗?您的
数据表
建议正是我想要的。很明显,你已经指出了这一点。想回答吗?谢谢你的回答。这对于这个伪函数很好,但是对于使用多个统计数据(
mean()
var()
length()
…)的更复杂的计算来说,它并不比创建汇总表更方便,每个汇总统计数据都必须传递给函数。是的,但是请注意
mean(c(10,8))
是9,而
平均值(c(9,9))
也是9。我认为您的目标是能够将您的函数应用于非相等组,而不必做汇总表。这个代码就是这样做的。基本上,我不确定您想要什么,将基线(
timepoint==0
)和组的计数向量传递给每个组的任意函数。@aosmith谢谢您的建议,我已尝试使问题更清楚。谢谢您的回答。这对于这个伪函数很好,但是对于使用多个统计数据(
mean()
var()
length()
…)的更复杂的计算来说,它并不比创建汇总表更方便,每个汇总统计数据都必须传递给函数。是的,但是请注意
mean(c(10,8))
是9,而
平均值(c(9,9))
也是9。我认为您的目标是能够将您的函数应用于非相等组,而不必做汇总表。这个代码就是这样做的。基本上,我不确定你想要的是什么,将基线(
timepoint==0
)和组的计数向量传递给每个组的任意函数。@aosmith谢谢你的建议,我试图让问题更清楚。很明显,我很不好意思错过了它。我现在把这个问题留给
dplyr
回答。很明显,我很不好意思错过了它。我现在将问题留待
dplyr
回答。+1我接受了另一个答案,因为它是最先发布的,但这是我要求的
dplyr
方法。我喜欢您通常使用
dplyr
获得的可读代码,但在这种情况下,我发现
data.table
方法更容易阅读+1我接受了另一个答案,因为它是最先发布的,但这是我要求的
dplyr
方法。我喜欢您通常使用
dplyr
获得的可读代码,但在这种情况下,我发现
data.table
方法更容易阅读!