使用tidyverse重塑data.frame及其列名

时间:2018-07-06 18:41:53

标签: r dataframe dplyr tidyverse

我有一个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]) 的方式来获得它?

1 个答案:

答案 0 :(得分:3)

我们可以先做unite,然后再做spreadunite的“年龄”和“性别”创建一个单独的列,将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