2017-05-13 3 views
1

Ich habe einen (großen) Datenrahmen mit Variablen, die jeweils ein comment Attribut haben.Zugreifen auf (Attribute von) einer Liste von Variablen aus einem Datenrahmen basierend auf einem Vektor

# Basic sample data 
df <- data.frame(a = 1:5, b = 5:1, c = 5:9, d = 9:5, e = 1:5) 
comment(df$a) <- "Some explanation" 
comment(df$b) <- "Some description" 
comment(df$c) <- "etc." 

Ich mag würde die comment Attribute für einige dieser Variablen sowie eine beleuchtete der möglichen Werte zu extrahieren.

So beginne ich durch die Liste der Variablen definieren ich entpacken:

variables_to_extract = c("a", "b", "e") 

Ich würde normalerweise auf einer Teilmenge des Datenrahmens arbeiten, aber dann zugreifen kann ich nicht die Attribute (zB comment) noch die Liste der möglichen Werte von jede Variable.

library(tidyverse) 
df %>% select(one_of(variables_to_export)) %>% comment() 
# accesses only the 'comment' attribute of the whole data frame (df), hence NULL 

Ich habe auch versucht, durch df[[variables_to_export]] zugreifen, aber es erzeugt einen Fehler ...

df[[variables_to_export]] 
# Error: Recursive Indexing failed at level 2 

Ich wollte alles in einem Datenrahmen extrahieren, sondern auch wegen der rekursiven Teilungsfehler, es doesn arbeite nicht.

meta <- data.frame(variable = variables_to_export, 
        description = comment(papers[[variables_to_export]]), 
        values = papers[[vairables_to_export]] %>% 
        unique() %>% na.omit() %>% sort() %>% paste(collapse = ", ")) 
# Error: Recursive Indexing failed at level 2 
+4

'Bibliothek (tidyverse) verwenden; df%>% select (one_of (variables_to_extract))%>% map (Kommentar) 'oder in der Basis,' lapply (df [, variables_to_extract], Kommentar) ' – alistaire

Antwort

3

Da ein data.frame eine Liste ist, Sie lapply oder purrr::map aufzubringen, um eine Funktion (zB comment) zu jedem Vektor enthält verwenden können:

library(tidyverse) 

df %>% select(one_of(variables_to_extract)) %>% map(comment) # in base R, lapply(df[variables_to_extract], comment) 
#> $a 
#> [1] "Some explanation" 
#> 
#> $b 
#> [1] "Some description" 
#> 
#> $e 
#> NULL 
es in einem

zu setzen data.frame,

data_frame(variable = variables_to_extract, 
      # iterate over variable, subset df and if NULL replace with NA; collapse to chr 
      description = map_chr(variable, ~comment(df[[.x]]) %||% NA), 
      values = map(variable, ~df[[.x]] %>% unique() %>% sort())) 

#> # A tibble: 3 x 3 
#> variable  description values 
#>  <chr>   <chr> <list> 
#> 1  a Some explanation <int [5]> 
#> 2  b Some description <int [5]> 
#> 3  e    <NA> <int [5]> 

Dies lässt values als Liste Spalte, die in der Regel sinnvoller ist, aber ich f Sie würden lieber hinzufügen in toString, um es zu reduzieren und map_chr zu vereinfachen.

1

können wir Map von base R

Map(comment, df[variables_to_extract]) 
#$a 
#[1] "Some explanation" 

#$b 
#[1] "Some description" 

#$e 
#NULL 
Verwandte Themen