2017-09-12 4 views
1

2つの異なるグループの2つの測定値を持つデータがあり、それぞれのサンプル数があります。 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) 

私は、各データフレームをワイドフォーマットに再形成して、統計的比較のために各グループの2つの測定値のベクトルを単一の列から簡単に抽出できるようにしたいと考えています。私の問題は、サンプルを一度、その後spread()以上に測定されているときがあるので動作しませんが生じ

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

:たとえば、次のようにのようなリストを下にマッピングすることができ

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

Duplicate identifiers for rows

これを回避する最も良い方法は、結合されたグループ/ measurにグループ化された新しいインデックス列を追加することです固有の行識別子を提供します。これは、単一のデータフレームで機能します。

ただし、リストをマップするために縮尺することはできません。

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

私はそれが間違った場所で探している示唆次のエラーを取得するよう、これはtidyevalものでなければならないと思います。

Evaluation error: Column gr_m_index must be length 24 (the number of rows) or one, not 4.

にはどうすればデータフレームの列にグループ化されたインデックスを追加する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 

アプローチ2df2$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) 
関連する問題