Проблема при анализе реальных данных с мурлыканьем - PullRequest
1 голос
/ 27 января 2020

Я проанализировал реальный набор данных,

Набор данных: https://github.com/ThinkR-open/datasets/blob/master/README.md

tweets <-  readRDS("#RStudioConf.RDS")

rstudioconf <- as.list(NULL)

for (i in 1:nrow(tweets)) {
  rstudioconf[[i]] <- tweets[i,]
}

Я хочу ответить на вопрос из набора данных: как многие твиты содержат ссылку на URL, связанный с GitHub?

ниже мой код:

# Extract the "urls_url" elements, and flatten() the result
urls_clean <- map(rstudioconf, "urls_url") %>%
  flatten()

# Remove NA from list 
compact_urls <-  urls_clean %>%
  map(discard,is.na) %>% 
  compact()

# Create a mapper that detects the patten "github"
has_github <- as_mapper(~ str_detect(.x, "github"))

# Look for the "github" pattern, and sum the result
**map_lgl(compact_urls, has_github) %>% sum()

последняя строка кода

map_lgl (compact_urls, has_github)%>% sum ()

выдает ошибку:

Ошибка: результат 10 должен быть одним логическим, а не логический вектор длины 2

Я действительно запутался, код map_lgl(compact_urls, has_github) должен дать логический вектор с TRUE и FALSE, затем этот вектор был передан в sum() и TRUE значения суммируются и, наконец, возвращают число. Я никогда не задумываюсь, что это даст мне ошибку. Может ли кто-нибудь помочь? Спасибо!

1 Ответ

1 голос
/ 27 января 2020

map_lgl возвращает ошибку, потому что некоторые элементы list имеют разные length. Это указано в ?map

map_lgl (), map_int (), map_dbl () и map_chr () возвращают вектор atomi c указанного типа (или при попытке d ie) .

out <- map(compact_urls, has_github)
table(lengths(out))

#   1    2    3    6 
#1117   22    4    1 

Мы можем unlist вывод из map и получить sum

sum(unlist(out))

. Его можно воспроизвести на простом примере.

map_lgl(list(FALSE, TRUE), I) #each list element of length 1
#[1] FALSE  TRUE

map_lgl(list(FALSE, c(TRUE, TRUE)), I) # one element of length 2

Ошибка: Результат 2 должен быть одним логическим, а не вектором класса AsIs и длиной 2


В случае, если цель состоит в том, чтобы вернуть только одно значение ИСТИНА / ЛОЖЬ, затем обернуть функцию с помощью any

has_github <- as_mapper(~ any(str_detect(.x, "github")))

Теперь попробуйте с map_lgl

map_lgl(compact_urls, has_github) %>% 
         sum()
#[1] 347
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...