2017-10-19 15 views
0

importer mes données à partir de plusieurs fichiers Excel dans R, et mes données ressemble à ceci dans R (il pourrait y avoir 100+ fichiers chaque jour):extrait certaines données à partir de plusieurs fichiers Excel avec R

> data 
[[1]] 
    ST Code Emp   Employee    Pay.Code Hours Gross 
1 AL 7229 65     S    HOURLY 0.00 0.00 
2 AL 7229 65     S    SALARY 0.00 3060.00 
3 AL 7229 65     S    PER DIEM 0.00 765.00 
4 AL 7229 65     S EXPENSE REIMBURSEMENT 0.00 11.00 
5 CA 42 2     R    HOURLY 60.00 720.00 
6 CA 42 2     R    OVERTIME 3.25 58.50 
7 CA 42 3     A    HOURLY 80.00 800.00 
8 CA 42 3     A    OVERTIME 6.25 93.75 
9 CA 42 4     N    HOURLY 79.25 990.63 
10 CA 42 4     N    OVERTIME 7.00 131.25 
11 CA 42 9     P    HOURLY 32.00 352.00 
12 CA 42 9     P    OVERTIME 1.75 28.88 
13 CA 42 10     E    HOURLY 72.00 864.00 
14 CA 42 10     E    OVERTIME 5.00 90.00 

[[2]] 
    ST Code Employee Pay.Code Gross 
1 AL 7229  NA  NA 23954.0 
2 AL 8380  NA  NA 11092.1 
3 GA 7380  NA  NA 98142.0 
4 GA 8380  NA  NA 11984.0 
5 NC 7380  NA  NA 218129.0 
6 NC 8380  NA  NA 27891.0 
7 TN 7380  NA  NA 28441.0 
8 TN 8380  NA  NA 8348.0 

maintenant Je suis en train de faire est d'obtenir code = "7229" comme un ensemble de données unique et l'exportation vers un nouveau fichier excel comme ceci:

> data 

    ST Code Emp   Employee    Pay.Code Hours Gross 
1 AL 7229 65     S    HOURLY 0.00 0.00 
2 AL 7229 65     S    SALARY 0.00 3060.00 
3 AL 7229 65     S    PER DIEM 0.00 765.00 
4 AL 7229 65     S EXPENSE REIMBURSEMENT 0.00 11.00 
5 AL 7229 NA           NA 23954.0 
6 AL 8380 NA           NA 11092.1 

y at-il de meilleures façons de le faire?

+0

est 'data' une liste de dataframes qui vous avez importé en utilisant quelque chose comme' lapply (liste de fichiers, la fonction (x) readxl (...)) '? Si oui, alors il s'agit plus d'une question sur la conversion d'une liste de dataframes en un seul dataframe que vous pouvez filtrer sur ... – lebelinoz

+0

je résous mon propre problème :) il suffit d'ajouter rbindlist dans ma fonction sera ok, merci les gars! –

Répondre

1

Cela devrait faire l'affaire:

library(tidyverse) 

df_list %>% 
    map_dfr(filter, Code == 7229) %>% 
    write_csv(path = "/INSERT/PATH/HERE/text.csv") 

Voici le code avec un exemple reproductible:

df_1 <- tribble(
    ~ST, ~Code, ~Emp, ~Employee, ~Pay.Code,    ~Hours, ~Gross, 
    "AL", 7229, 65, "S",  "HOURLY",    0.00, 0.00, 
    "AL", 7229, 65, "S",  "SALARY",    0.00, 3060.00, 
    "AL", 7229, 65, "S",  "PER DIEM",    0.00, 765.00, 
    "AL", 7229, 65, "S",  "EXPENSE REIMBURSEMENT", 0.00, 11.00, 
    "CA", 42, 2, "R",  "HOURLY",    60.00, 720.00, 
    "CA", 42, 2, "R",  "OVERTIME",    3.25, 58.50, 
    "CA", 42, 3, "A",  "HOURLY",    80.00, 800.00, 
    "CA", 42, 3, "A",  "OVERTIME",    6.25, 93.75, 
    "CA", 42, 4, "N",  "HOURLY",    79.25, 990.63, 
    "CA", 42, 4, "N",  "OVERTIME",    7.00, 131.25, 
    "CA", 42, 9, "P",  "HOURLY",    32.00, 352.00, 
    "CA", 42, 9, "P",  "OVERTIME",    1.75, 28.88, 
    "CA", 42, 10, "E",  "HOURLY",    72.00, 864.00, 
    "CA", 42, 10, "E",  "OVERTIME",    5.00, 90.00 
) 

df_2 <- tribble(
    ~ST, ~Code, ~Employee, ~Pay.Code, ~Gross, 
    "AL", 7229,  NA,  NA, 23954.0, 
    "AL", 8380,  NA,  NA, 11092.1, 
    "GA", 7380,  NA,  NA, 98142.0, 
    "GA", 8380,  NA,  NA, 11984.0, 
    "NC", 7380,  NA,  NA, 218129.0, 
    "NC", 8380,  NA,  NA, 27891.0, 
    "TN", 7380,  NA,  NA, 28441.0, 
    "TN", 8380,  NA,  NA, 8348.0 
) 

df_list <- list(df_1, df_2) 

df_list %>% 
    map_dfr(filter, Code == 7229) %>% 
    write_csv(path = "/INSERT/PATH/HERE/text.csv") 

Ce qui donne:

# A tibble: 5 x 7 
    ST Code Emp Employee    Pay.Code Hours Gross 
    <chr> <dbl> <dbl> <chr>     <chr> <dbl> <dbl> 
1 AL 7229 65  S    HOURLY  0  0 
2 AL 7229 65  S    SALARY  0 3060 
3 AL 7229 65  S    PER DIEM  0 765 
4 AL 7229 65  S EXPENSE REIMBURSEMENT  0 11 
5 AL 7229 NA  <NA>     <NA> NA 23954 
1

Essayez

df = do.call("rbind", data) 

Ensuite, vous aurez toutes vos données en une seule trame de données que vous pouvez filtrer:

df[which(df$Code == 7229),]