2017-09-12 40 views
1

我有两个测量数据在两个不同的组上,每个组有多个样本。我简单的版本有6个样品每一个看起来是这样的:如何使用map()将分组索引添加到数据框的列中?

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()不起作用,因为有我的问题出现

Duplicate identifiers for rows

我想最好的解决办法是添加一个新的索引列,分组在合并组/ measur这将提供唯一的行标识符。这适用于单个数据框。

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东西,因为我碰到下面的错误提示是找错了地方。如何使用map()将分组索引添加到数据框的列?

回答

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) 
相关问题