【问题标题】:How to I use map() to add a grouped index to a column of data frames?如何使用 map() 将分组索引添加到数据框列?
【发布时间】:2018-02-20 09:47:30
【问题描述】:

我的数据有两个不同组的两个测量值,每个组有多个样本。我的简单版本有 6 个样本,每个样本如下所示:

library(tidyverse)

df <- tibble(group = c(rep("group_A", 12), rep("group_B", 12)),
         sample = rep(1:6, 4),
         measurement = rep(c(rep("meas_A", 6), rep("meas_B", 6)), 2), 
         value = round(runif(24, min = 0, max = 60)))

但由于测量是在不同条件下重复的,它实际上是一系列相似的数据帧,以列表的形式表示:

df2 <- bind_rows(df,df,df,df) %>% 
  mutate(condition = c(rep("One", 24), rep("Two", 24), 
                       rep("Three", 24), rep("Four", 24))) %>% 
  unite(group_meas, group, measurement) %>% 
  nest(-condition) 

最终,我想将每个数据框重塑为宽格式,以便可以轻松地从单个列中提取每个组的两个测量值的向量以进行统计比较。例如:

df %>% unite(group_meas, group, measurement) 
  %>%  spread(group_meas, value)

可以像这样映射到列表中:

df2 %>% mutate(data = map(data, ~spread(.x, group_meas, value))) 

我的问题出现在多次测量样本时,然后spread() 不起作用,因为有

行的重复标识符

我认为解决此问题的最佳方法是添加一个按组合组/度量分组的新索引列,这将提供唯一的行标识符。这适用于单个数据框。

df %>% unite(group_meas, group, measurement) %>% 
  group_by(group_meas) %>% 
  mutate(gr_m_index = row_number())

但是我无法将其缩放以映射到列表中。

df2 %>% mutate(data = map(data, ~  group_by(.x, group_meas) %>% 
                            mutate(gr_m_index = row_number())))

我认为这一定是 tidyeval 的事情,因为我收到以下错误,表明它在错误的位置。

求值错误:gr_m_index 列的长度必须为 24( 行)或一个,而不是 4 个。

如何使用map() 为一列数据框添加分组索引?

【问题讨论】:

    标签: r tidyr tidyverse purrr


    【解决方案1】:

    据我了解,根据错误消息,row_number() 正在返回 c(1, 2, 3, 4)。这是因为行数是根据df2 计算的,而不是嵌套的数据框。

    以下任何一种方法都应该有效:

    方法 1。将要映射的所有转换定义为独立函数。

    index_spread <- function(data){
      return(data %>% 
               group_by(group_meas) %>% 
               mutate(gr_m_index = row_number()) %>%
               spread(group_meas, value))
    }
    
    df2 %>% mutate(data = map(data, index_spread)) %>% unnest()
    
    # A tibble: 24 x 7
       condition sample gr_m_index group_A_meas_A group_A_meas_B group_B_meas_A group_B_meas_B
           <chr>  <int>      <int>          <dbl>          <dbl>          <dbl>          <dbl>
     1       One      1          1             12             43             39             52
     2       One      2          2             11             60              8             20
     3       One      3          3             41             23             16             29
     4       One      4          4             23             47             23             36
     5       One      5          5             46             56              1             30
     6       One      6          6             30             13             23             11
     7       Two      1          1             12             43             39             52
     8       Two      2          2             11             60              8             20
     9       Two      3          3             41             23             16             29
    10       Two      4          4             23             47             23             36
    # ... with 14 more rows
    

    方法 2。对df2$data 执行转换,并将转换后的数据帧列表分配回原始数据帧。

    df2$data <- map(df2$data, ~group_by(.x, group_meas) %>% 
                      mutate(gr_m_index = row_number()) %>%
                      spread(group_meas, value))
    df2 %>% unnest()
    
    # (same output as above)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-10
      • 2019-01-16
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2017-04-30
      相关资源
      最近更新 更多