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

时间:2017-09-12 04:07:03

标签: r tidyr tidyverse purrr

我的数据包含两个不同组的两个测量值,每个组都有多个样本。我的简单版本有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()将分组索引添加到数据框列?

1 个答案:

答案 0 :(得分:1)

据我了解,根据错误消息,nmap -sT <Instance Public IP-address> 正在返回row_number()。这是因为行数是基于c(1, 2, 3, 4)计算的,而不是嵌套数据帧。

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

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

df2

方法2 。在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 上执行转换,&amp;将转换后的数据帧列表分配回原始列表。

df2$data