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
方法更容易阅读!