2017-09-12 2 views
1

Ich habe Daten, die zwei Messungen von zwei verschiedenen Gruppen mit einer Anzahl von Proben für jede hat. I einfache Version mit 6 Proben, die jeweils wie folgt aussieht:Wie verwende ich map(), um einen gruppierten Index zu einer Spalte von Datenrahmen hinzuzufügen?

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))) 

sondern weil die Messungen in verschiedenen Bedingungen wiederholt worden ist es tatsächlich eine Reihe von ähnlichen Datenrahmen in einer Liste dargestellt:

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) 

Letztendlich Ich möchte jeden Datenrahmen in ein breites Format umformen, so dass Vektoren der zwei Messungen für jede Gruppe leicht aus einzelnen Spalten für einen statistischen Vergleich extrahiert werden können. Zum Beispiel:

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

, die die Liste werden können wie so abgebildet nach unten:

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

Mein Problem tritt auf, wenn eine Probe mehr gemessen wurde als einmal und dann spread() funktioniert nicht, weil es

Duplicate identifiers for rows

ich stelle dar, der beste Weg, um dieses ist eine neue Index-Spalte auf der kombinierten Gruppe/measur gruppiert hinzufügen und dies wird eindeutige Zeilenkennungen liefern. Dies funktioniert für einen einzelnen Datenrahmen.

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

Allerdings kann ich es nicht skalieren, um eine Liste abzubilden.

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

Ich denke, das eine tidyeval Sache sein muss, als ich die folgende Fehlermeldung erhalten was darauf hindeutet, es ist an der falschen Stelle suchen.

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

Wie verwende ich map() einen gruppierten Index auf eine Spalte von Datenrahmen hinzufügen?

Antwort

1

Wie ich es verstehe, row_number() zurückgegeben wurde, basierend auf der Fehlermeldung c(1, 2, 3, 4). Dies liegt daran, dass die Anzahl der Zeilen basierend auf df2 und nicht auf den verschachtelten Datenrahmen gezählt wurde.

Entweder Ansatz unten sollte funktionieren:

Ansatz 1. Definieren Sie alle Transformationen, die als eigenständige Funktion zugeordnet werden sollen.

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 

Ansatz 2. Führen Sie die Transformationen unter , & aus, um die Liste der transformierten Datenrahmen dem Original zuzuordnen.

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) 
Verwandte Themen