Как назначить элементы различным подмножествам в соответствии с номером буквы «А» в элементе в R? - PullRequest
0 голосов
/ 24 августа 2018

Я хочу распределить свои данные по разным группам в зависимости от количества букв «А».Например,

library("stringr")
data1 <- c("apple","appreciate","available","account","adapt")
data2 <- c("tab","banana","cable","tatabox")
list1 <- list(data1,data2)
ca <- lapply(list1, function(x) str_count(x, "a"))
> ca
[[1]]
[1] 1 2 3 1 2

[[2]]
[1] 1 3 1 2

И я хочу отделить это следующим образом:

a1
[[1]]
[1] "apple" "account" 
[[2]]
[1] "tab" "cable"

a2
[[1]]
[1] "appreciate" "adapt"
[[2]]
[1] "tatabox"

a3 ....

Не могли бы вы дать мне подсказку, как я могу это сделать?Спасибо

Ответы [ 2 ]

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

Вы можете использовать purrr::transpose после разделения.

Примечание. Этот код работает, только если у вас установлен пакет purrr.

purrr::transpose(Map(split, list1, ca))
# $`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"

Для обновленного примера:

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

вы можете использовать:

lapply(unique(unlist(ca)), 
       function(i) lapply(m, `[[`, as.character(i)))

# [[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"
# 
# 
# [[4]]
# [[4]][[1]]
# NULL
# 
# [[4]][[2]]
# [1] "aaaaaaa"
0 голосов
/ 24 августа 2018

Это легко сделать с помощью mapply.Но вы должны установить аргумент SIMPLIFY = FALSE, по умолчанию - TRUE, и он возвращает matrix.
Затем, unlist результат и split снова, на этот раз атрибутом namesрезультирующий список.

ma <- mapply(split, list1, ca, SIMPLIFY = FALSE)
tmp <- unlist(ma, recursive = FALSE)
pattern <- ".*\\.([[:digit:]]+)\\s*$"
replace <- "\\1"
split(tmp, sub(pattern, replace, names(tmp)))
#$`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"

Наконец, уберите за собой:

rm(tmp)

Объяснение.

mapply объяснено выше.Попробуйте запустить его без аргумента SIMPLIFY и посмотрите, каков будет результат.
Затем unlist.Это связано с тем, что mapply было применено к списку, результатом split и ma является список списков.Если он становится простым списком, все строки всех членов data1, data2` и т. Д. Находятся на одном уровне списка.

Теперь последний split.Поскольку вектор names(tmp) не является вектором отсчетов целевой буквы "a", но может быть более сложным, используйте regex , чтобы сохранить только подсчеты.

Это последние цифры после последнего периода "." и до конца строки имен.

pattern <- ".*\\.([[:digit:]]+)\\s*$"
  1. . любой символ;
  2. .* любой символ повторяется любое количество раз, ноль или более;
  3. \\. период, экранирован \\, потому что это специальный символ;
  4. (something) скобка создает группу, в данном случае первую группу;
  5. [[:digit:]] переносимый символьный класс десятичных цифр;
  6. [[:digit:]]+ цифры повторяются один или несколько раз;
  7. ([[:digit:]]+) группа состоит как минимум из одной цифры, может быть больше;
  8. \\s* повторяется пробелноль или более раз (возможно, без пробелов вообще);
  9. $ конец строки.

При взгляде с конца строки это

  1. ([[:digit:]]+)\\s*$ одна или несколько цифр, за которыми могут следовать пробелы непосредственно перед концом строки;
  2. \\.([[:digit:]]+)\\s*$ есть точка, \\., непосредственно перед шаблоном в точке 1.
  3. .*\\.([[:digit:]]+)\\s*$ этому могут предшествовать любые символы, повторяемые любое количество раз.

Замена на \\1 соответствует пареопределено выше.Это означает, что только группа, последние цифры после последнего периода, дойдут до результата.

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