Сортировка списков по purrr :: transpose, но некоторые значения отсутствуют - PullRequest
0 голосов
/ 25 августа 2018

Я хочу отсортировать списки в зависимости от количества «a» в каждом элементе.

library("purrr")
data1 <- c("apple","appreciate","available","account","adapt")
data2 <- c("tab","banana","cable","tatabox","aaaaaaa")
list1 <- list(data1,data2)
ca <- lapply(list1, function(x) str_count(x, "a"))
t2 <- Map(split, list1, ca)
t3 <- transpose(t2)
> t3
$`1`
$`1`[[1]]
[1] "apple"   "account"

$`1`[[2]]
[1] "tab"   "cable"


$`2`
$`2`[[1]]
[1] "appreciate" "adapt"     

$`2`[[2]]
[1] "tatabox"


$`3`
$`3`[[1]]
[1] "available"

$`3`[[2]]
[1] "banana"

Он потерял «aaaaaaa», который в data2.Как я могу решить эту проблему?

Я нашел решение:

data1 <- c("apple","appreciate","available","account","adapt")
data2 <- c("tab","banana","cable","tatabox","aaaaaaa","aaaaaaaaaaa")
list1 <- list(data1,data2)
ca <- lapply(list1, function(x) str_count(x, "a"))
k11<- flatten(Map(split, list1, ca))
k1<-split(k11, as.integer(names(k11)))

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Мы также можем сделать это, используя трубу с purrr функциями

map(list1, str_count, "a") %>% 
        map2(list1, ., split) %>%
        flatten %>% 
        split(names(.))
#$`1`
#$`1`$`1`
#[1] "apple"   "account"

#$`1`$`1`
#[1] "tab"   "cable"


#$`2`
#$`2`$`2`
#[1] "appreciate" "adapt"     

#$`2`$`2`
#[1] "tatabox"


#$`3`
#$`3`$`3`
#[1] "available"

#$`3`$`3`
#[1] "banana"


#$`7`
#$`7`$`7`
#[1] "aaaaaaa"
0 голосов
/ 25 августа 2018

Ссылаясь на слова lionel : "transpose() обрабатывает списки списков как неявно прямоугольные таблицы".Это не было разработано для многих крайних случаев как текущий.Тем не менее, вы можете получить рекрифицированное место по месту, более длинное в начале: transpose(t2[2:1]).

Однако этот обходной путь не может быть обобщен.Я предпочитаю следующий способ - объединить подсписки в один список и снова разделить:

> t3 <- do.call(c, t2)
> split(t3, names(t3))
$`1`
$`1`$`1`
[1] "apple"   "account"

$`1`$`1`
[1] "tab"   "cable"


$`2`
$`2`$`2`
[1] "appreciate" "adapt"     

$`2`$`2`
[1] "tatabox"


$`3`
$`3`$`3`
[1] "available"

$`3`$`3`
[1] "banana"


$`7`
$`7`$`7`
[1] "aaaaaaa"

Редактировать

Функция для именованного и безымянного ввода:

data1 <- c("apple","appreciate","available","account","adapt")
data2 <- c("tab","banana","cable","tatabox","aaaaaaa","aaaaaaaaaaa")
list1 <- list(data1,data2)
names(list1) <- c("atf","bdfs")

f <- function(x){
    if(is.null(names(x))){
        names(x) <- make.names(seq_along(x))
    }
    dtf <- stack(x)
    res <- split(dtf, str_count(dtf$values, 'a'))
    lapply(res, function(y) split(y$values, y$ind, drop = TRUE) )
}

f(list1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...