按组划分列(数据框中的分组)

时间:2015-01-13 20:46:14

标签: r

我想通过将每个响应/列除以其'来计算相对响应值。小组意思。 我设法制作了一种详尽的(因而不满意的)方法。我的数据集非常大,包含多个组和响应。

###############
# 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一段时间了,但我仍然在努力处理琐碎的数据处理程序。我相信我一定会遗漏一些东西,我怎样才能更好地解决这些群体?

3 个答案:

答案 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