我想通过将每个响应/列除以其'来计算相对响应值。小组意思。 我设法制作了一种详尽的(因而不满意的)方法。我的数据集非常大,包含多个组和响应。
###############
# example
# used packages
require(plyr)
# sample data
group <- c(rep("alpha", 3), rep("beta", 3), rep("gamma", 3))
a <- rnorm(9, 10,1) #some random data as response
b <- rnorm(9, 10,1)
df <- data.frame(group, a, b)
# my approach
# means for each group and response
df.means <- ddply(df, "group", colwise(mean))
# clunky method
df$rel.a[df$group=="alpha"] <-
df$a[df$group=="alpha"]/df.means$a[df.means$group=="alpha"]
df$rel.a[df$group=="beta"] <-
df$a[df$group=="beta"]/df.means$a[df.means$group=="beta"]
# ... etc
df$rel.b[df$group=="gamma"] <-
df$b[df$group=="gamma"]/df.means$b[df.means$group=="gamma"]
#desired outcome (well, perhaps with no missing values)
df
###############
我一直在使用r一段时间了,但我仍然在努力处理琐碎的数据处理程序。我相信我一定会遗漏一些东西,我怎样才能更好地解决这些群体?
答案 0 :(得分:4)
使用dplyr软件包很容易理解,pp是数据框的下一个版本:
library(dplyr)
df %>% group_by(group) %>% mutate_each(funs(./mean(.)))
。表示每列中的数据(按组)。 mutate_each用于修改除分组变量之外的每个列。您在funs参数内指定应将哪些函数应用于每列。
答案 1 :(得分:2)
使用data.table
软件包,您可以在一行中快速轻松地执行此操作(根本不创建df.means
),只需
library(data.table)
setDT(df)[, paste0("real.", names(df)[-1]) :=
lapply(.SD, function(x) x/mean(x)),
group]
这将在df
group
内的所有列(group
除外)上运行dplyr
并将每个值除以组均值
修改:如果您要覆盖原始列(例如paste0
答案中的答案,可以通过小修改(删除setDT(df)[, names(df)[-1] := lapply(.SD, function(x) x/mean(x)), group]
部分)来执行此操作:< / p>
{{1}}
答案 2 :(得分:1)
如果我理解正确,您也可以在dplyr
中轻松完成此操作。鉴于以上数据
library(dplyr)
df %>% group_by(group) %>% mutate(aresp = a/ mean(a), bresp= b/mean(b))
返回:
group a b aresp bresp
1 alpha 10.052847 8.076405 1.0132828 0.8288214
2 alpha 10.002243 11.447665 1.0081822 1.1747888
3 alpha 9.708111 9.709265 0.9785350 0.9963898
4 beta 10.732693 7.483065 0.9751125 0.8202278
5 beta 11.719656 11.270522 1.0647824 1.2353754
6 beta 10.567513 8.615878 0.9601051 0.9443968
7 gamma 10.221040 11.181763 1.0035630 0.9723315
8 gamma 10.302611 11.286443 1.0115721 0.9814341
9 gamma 10.030605 12.031643 0.9848649 1.0462344