【问题标题】:Using tidyverse to reshape a data.frame and its column names使用 tidyverse 重塑 data.frame 及其列名
【发布时间】:2018-07-06 18:41:52
【问题描述】:

我有一个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"))),其中值为meandf$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])

有没有tidyverse 的方法来获得它?

【问题讨论】:

    标签: r dataframe dplyr tidyverse


    【解决方案1】:

    我们可以先unite,然后是spreadunite 'age' 和 'sex' 创建单个列,mutate 将值设置为 factor (使顺序与预期相同)并执行 spread 到 'wide' 格式

    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_at来代替group_by_,它将字符串作为变量

    df %>%
         group_by_at(factors) %>%
         summarise(mean.val = mean(val)) %>%
         unite(agesex, age, sex, sep=".") %>% 
         mutate(agesex = factor(agesex, levels = unique(agesex))) %>%
         spread(agesex, mean.val)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      相关资源
      最近更新 更多