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ď č. 1Alternatí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 ...