/ / Použitie vektorizovanej funkcie do zoznamu pomocou un-listing, potom opätovné zaradenie - r, zoznam, vektorizácia

Použitie vektorizovanej funkcie na zoznam pomocou un-listing, potom opätovné zapísanie - r, list, vectorization

Predpokladajme, že máte zoznam vektorových znakov:

set.seed(42)
x <- lapply(sample(10:50), function(x) {
sapply(1:x, function(y) {
paste(sapply(y, sample, x=letters, size=sample(5:10, 1)), collapse="")
})
})

Budete chcieť použiť vektorizovanú operáciu v celom tomto zozname. Jedna možnosť je unlist(x), a potom použite vektorizovanú funkciu:

y <- nchar(unlist(x))

Aká je najefektívnejšia cesta y späť do rovnakej štruktúry zoznamu ako x? Existuje lepší spôsob, ako tento problém riešiť?

odpovede:

4 pre odpoveď č. 1

Alternatívou by bolo použitie as.relistable a relist funguje takto:

y <- as.relistable(x)
z <- nchar( unlist(x) )
z <- relist(z,y)
str(head(z))
#List of 6
# $ : int [1:47] 7 8 6 6 6 5 8 10 10 5 ...
# $ : int [1:50] 7 9 9 6 7 10 7 6 10 8 ...
# $ : int [1:21] 8 7 9 5 9 10 5 5 8 9 ...
# $ : int [1:41] 5 9 9 9 5 5 5 5 10 9 ...
# $ : int [1:33] 9 5 9 9 8 9 7 9 6 10 ...
# $ : int [1:28] 5 5 5 9 8 8 8 6 9 6 ...

2 pre odpoveď č. 2

Mám ťažkosti s pochopením prečo lapply nie je odpoveď (a tiež prečo Josh odstránil odpoveď, ktorá presne povedala, že pred 6 hodinami.)

charcounts <- lapply(x, nchar )
str(head(charcounts))
List of 6
$ : int [1:47] 7 8 6 6 6 5 8 10 10 5 ...
$ : int [1:50] 7 9 9 6 7 10 7 6 10 8 ...
$ : int [1:21] 8 7 9 5 9 10 5 5 8 9 ...
$ : int [1:41] 5 9 9 9 5 5 5 5 10 9 ...
$ : int [1:33] 9 5 9 9 8 9 7 9 6 10 ...
$ : int [1:28] 5 5 5 9 8 8 8 6 9 6 ...