我有一个data.frame
的实验,其中有几个因素和每个样品的测量值。例如:
factors <- c("age","sex")
data.frame
看起来像这样:
library(dplyr)
set.seed(1)
df <- do.call(rbind,lapply(1:10,function(i) expand.grid(age=c("Y","O"),sex=c("F","M")) %>% dplyr::mutate(val=rnorm(4))))
grouped.mean.val.df <- df %>% dplyr::group_by_(.dots=factors) %>% dplyr::summarise(mean.val=mean(val))
我想创建一个data.frame
,它只有一行并且列数是因子组合的数量(即本示例中的nrow(expand.grid(age=c("Y","O"),sex=c("F","M"))
),其中值是{{1} } mean
用于df$val
的相应组合。
要获取我所做的每种因素组合的factors
mean
:
df$val
我想要得到的结果grouped.mean.val.df <- df %>% dplyr::group_by_(.dots=factors) %>% dplyr::summarise(mean.val=mean(val))
是:
data.frame
有没有一种res.df <- data.frame(Y.F=grouped.mean.val.df$mean.val[1],
Y.M=grouped.mean.val.df$mean.val[2],
O.F=grouped.mean.val.df$mean.val[3],
O.M=grouped.mean.val.df$mean.val[4])
的方式来获得它?
答案 0 :(得分:3)
我们可以先做unite
,然后再做spread
。 unite
的“年龄”和“性别”创建一个单独的列,将mutate
的值factor
(使顺序与预期的顺序相同)并进行{{ 1}}为“宽”格式
spread
此外,我们可以使用library(tidyverse)
grouped.mean.val.df %>%
unite(agesex, age, sex, sep=".") %>%
mutate(agesex = factor(agesex, levels = unique(agesex))) %>%
spread(agesex, mean.val)
# A tibble: 1 x 4
# Y.F Y.M O.F O.M
# <dbl> <dbl> <dbl> <dbl>
#1 0.0695 0.411 -0.118 0.00577
代替group_by_
,后者将字符串作为变量
group_by_at