/ / Zastosowanie funkcji wektoryzowanej do listy przez usunięcie z listy, a następnie ponowne wystawienie - r, lista, wektoryzacja

Zastosowanie funkcji wektoryzowanej do listy przez un-listing, a następnie ponowne zestawienie - r, list, wektoryzacja

Załóżmy, że masz listę wektorów znaków:

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="")
})
})

Chciałbyś zastosować wektoryzowaną operację na całej liście. Jedną z opcji jest unlist(x), a następnie zastosuj wektoryzowaną funkcję:

y <- nchar(unlist(x))

Jaki jest najbardziej skuteczny sposób na zdobycie y z powrotem do tej samej struktury listy, co x? Czy istnieje lepszy sposób rozwiązania tego problemu?

Odpowiedzi:

4 dla odpowiedzi № 1

Alternatywą byłoby użycie as.relistable i relist działa tak:

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 dla odpowiedzi nr 2

Mam trudności ze zrozumieniem, dlaczego lapply nie jest odpowiedzią (a także dlaczego Josh usunął swoją odpowiedź, która mówi dokładnie to 6 godzin temu).

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 ...