【问题标题】:Converting between long and short data.frame formats长短data.frame格式之间的转换
【发布时间】:2018-07-02 01:50:06
【问题描述】:

简单(?)tidyr问题:

我有一个data.frame,它有几个分组列和几个值列,格式为长格式。我想将其转换为短(宽)格式,其中key 将是分组列之一,而生成的data.frame 将为所有其他分组列和每个值列的每个组合都有一个列。

这是我的长格式data.frame

set.seed(1)
library(dplyr)
df <- data.frame(treatment = rep(c(rep("T1",3),rep("T2",3)),2),
                 species = c(rep("S1",6),rep("S2",6)),
                 group = rep(LETTERS[1:3],4),
                 n = as.integer(runif(12,10,20))) %>%
  dplyr::group_by(treatment,species) %>% dplyr::mutate(freq = n/sum(n))

这就是我希望得到的宽格式 data.frame 的内容:

res.df <- data.frame(group = LETTERS[1:3],
                     T1.S1.n = dplyr::filter(df,treatment == "T1",species == "S1")$n,
                     T1.S1.freq = dplyr::filter(df,treatment == "T1",species == "S1")$freq,
                     T2.S1.n = dplyr::filter(df,treatment == "T2",species == "S1")$n,
                     T2.S1.freq = dplyr::filter(df,treatment == "T2",species == "S1")$freq,
                     T1.S2.n = dplyr::filter(df,treatment == "T1",species == "S2")$n,
                     T1.S2.freq = dplyr::filter(df,treatment == "T1",species == "S2")$freq,
                     T2.S2.n = dplyr::filter(df,treatment == "T2",species == "S2")$n,
                     T2.S2.freq = dplyr::filter(df,treatment == "T2",species == "S2")$freq)

【问题讨论】:

    标签: r dataframe dplyr tidyr


    【解决方案1】:

    我们可以使用gather 转换为“长”格式,然后将unite 列在一起,spread 转换为“宽”

    library(tidyverse)
    gather(df, key, val, n:freq) %>% 
         unite(trtsp, treatment, species, key, sep = ".") %>%
         spread(trtsp, val)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2010-11-26
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多