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 № 1Alternatywą 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 ...