2 votes

Comment appliquer une fonction à chaque ligne d'une liste de tableaux dans R ?

J'ai 20 tableaux différents (appelés N1 à N20), chacun avec 9 colonnes et environ 2 millions de lignes dans R.

Dans la colonne numéro 8 (type : integer), je souhaite modifier la date. L'entrée dans chaque colonne numéro 8 de chaque tibble est toujours la même, c'est toujours le numéro "14190"

Je ne veux pas écrire :

N1[,8] <- lapply(N1[,8], function(x) format(as.Date(as.numeric(x),origin="1970-01-01"), "%Y-%m-%d"))
N2[,8] <- lapply(N2[,8], function(x) format(as.Date(as.numeric(x),origin="1970-01-01"), "%Y-%m-%d"))
N3[,8] <- lapply(N3[,8], function(x) format(as.Date(as.numeric(x),origin="1970-01-01"), "%Y-%m-%d"))
...
N20[,8] <- lapply(N20[,8], function(x) format(as.Date(as.numeric(x),origin="1970-01-01"), "%Y-%m-%d"))

Ma première idée était de définir une liste de N1 à N20, mais ma fonction a rencontré un problème parce qu'elle veut des nombres entiers comme argument.

Existe-t-il une solution rapide ? Peut-être sans lapply ?

Merci de votre attention !

1voto

Cole Points 9745

L'utilisation de listes facilite grandement les choses dans R. En particulier, nous pouvons établir une liste de vos N et utiliser ensuite lapply sur cette liste :

N1 = iris
N2 = iris

l = mget(ls(pattern = '^N\\d$'))
l = lapply(l, transform, Sepal.Length = as.integer(Sepal.Length))

l

Une autre approche de base peut consister à combiner tous vos tibbles en un seul tibble.

l2 = do.call(rbind, c(l, make.row.names = FALSE))
l2$id = rep(seq_along(l), vapply(l, nrow, 1L))
l2[, "Sepal.Width"] = as.integer(l2[, "Sepal.Width"])

## with packages
library(dplyr)
l %>%
    bind_rows(.id = "ID")%>%
    mutate(Sepal.Width = as.integer(Sepal.Width))

library(data.table)
rbindlist(l, id = TRUE)[, Sepal.Width := as.integer(Sepal.Width)]

1voto

stefan Points 21904

Premièrement. Vous n'avez pas besoin de boucler (= lapply) sur les lignes de votre df pour convertir la colonne. Deuxièmement. La conversion des 20 df pourrait être réalisée de la manière suivante :

N1 <- N2 <- data.frame(col1 = runif(10), col2 = rep(14190, 10))

lapply(1:2, function(x) { d <- get(paste0("N", x)); d[[2]] <- format(as.Date(as.numeric(d[[2]]),origin="1970-01-01"), "%Y-%m-%d"); d })
#> [[1]]
#>         col1       col2
#> 1  0.6086402 2008-11-07
#> 2  0.2982811 2008-11-07
#> 3  0.7500646 2008-11-07
#> 4  0.7203713 2008-11-07
#> 5  0.4445544 2008-11-07
#> 6  0.7837107 2008-11-07
#> 7  0.2335820 2008-11-07
#> 8  0.2021103 2008-11-07
#> 9  0.1840012 2008-11-07
#> 10 0.7598002 2008-11-07
#> 
#> [[2]]
#>         col1       col2
#> 1  0.6086402 2008-11-07
#> 2  0.2982811 2008-11-07
#> 3  0.7500646 2008-11-07
#> 4  0.7203713 2008-11-07
#> 5  0.4445544 2008-11-07
#> 6  0.7837107 2008-11-07
#> 7  0.2335820 2008-11-07
#> 8  0.2021103 2008-11-07
#> 9  0.1840012 2008-11-07
#> 10 0.7598002 2008-11-07

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X