R l oop функция для выбора элемента в нескольких объектах - PullRequest
2 голосов
/ 21 апреля 2020

Я использую пакет Google Trends R для выполнения нескольких запросов ключевых слов, например, так:

trends1 <- gtrends(keyword="compare", gprop=channel,geo="AU", time=time, category=249)
trends2 <- gtrends(keyword="switch", gprop=channel,geo="AU", time=time, category=249)
trends3 <- gtrends(keyword="change", gprop=channel,geo="AU", time=time, category=249)

Меня интересуют только проценты по времени , поэтому я выделите их:

time_trend1 <- trends1$interest_over_time
time_trend2 <- trends2$interest_over_time
time_trend3 <- trends3$interest_over_time

Но у меня есть 60 из них (и еще много, чтобы добавить). Я хочу написать повтор l oop (мне кажется):

#select only interest over time
x <- 0
repeat {
time_trend(x+1) <- trends(x+1)$interest_over_time
if (x == 61){break}
}

, но я получаю ошибку: Ошибка в трендах (x + 1): не удалось найти функцию "тренды"

что мне не хватает?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2020

Вы можете использовать lapply для перебора списка ключевых слов и извлечения запрошенного элемента следующим образом:

library(gtrendsR)
time <- "today+5-y"
channel <- "web"
keywords <- list("compare", "switch", "change")
trends <- setNames(lapply(keywords, function(x) gtrends(keyword=x, 
  gprop=channel, geo="AU", time=time, category=249)), keywords)
lapply(trends, `[[`, "interest_over_time")
#> $compare
#>           date hits geo      time keyword gprop category
#> 1   2015-04-26   25  AU today+5-y compare   web      249
#> 2   2015-05-03   26  AU today+5-y compare   web      249
#> 3   2015-05-10   41  AU today+5-y compare   web      249
#> 4   2015-05-17   29  AU today+5-y compare   web      249
#> 5   2015-05-24   32  AU today+5-y compare   web      249
# ...
#> 260 2020-04-12    9  AU today+5-y compare   web      249
#> 
#> $switch
#>           date hits geo      time keyword gprop category
#> 1   2015-04-26    0  AU today+5-y  switch   web      249
#> 2   2015-05-03    0  AU today+5-y  switch   web      249
#> 3   2015-05-10    0  AU today+5-y  switch   web      249
#> 4   2015-05-17    0  AU today+5-y  switch   web      249
#> 5   2015-05-24    0  AU today+5-y  switch   web      249
# ...
#> 260 2020-04-12    0  AU today+5-y  switch   web      249
#> 
#> $change
#>           date hits geo      time keyword gprop category
#> 1   2015-04-26   45  AU today+5-y  change   web      249
#> 2   2015-05-03   68  AU today+5-y  change   web      249
#> 3   2015-05-10   23  AU today+5-y  change   web      249
#> 4   2015-05-17   52  AU today+5-y  change   web      249
#> 5   2015-05-24   76  AU today+5-y  change   web      249
# ...
#> 260 2020-04-12   38  AU today+5-y  change   web      249

Создано в 2020-04-20 пакетом Представить (v0.3.0)

Редактировать : Проще всего манипулировать данными, когда отдельные элементы списка объединяются в data.table, tibble или data .Рамка. Здесь показан пример того, как удалить ненужные столбцы. Для подстановки по ключевому слову можно сделать, например, res[keyword=="compare"]

library(gtrendsR)
library(data.table)
time <- "today+5-y"
channel <- "web"
keywords <- list("compare", "switch", "change")
trends <- setNames(lapply(keywords, function(x) gtrends(keyword=x, 
  gprop=channel, geo="AU", time=time, category=249)), keywords)
res <- rbindlist(lapply(trends, `[[`, "interest_over_time"))
res[,-c("geo","category","time")]
#>            date hits keyword gprop
#>   1: 2015-04-26   25 compare   web
#>   2: 2015-05-03   26 compare   web
#>   3: 2015-05-10   41 compare   web
#>   4: 2015-05-17   29 compare   web
#>   5: 2015-05-24   32 compare   web
#>  ---                              
#> 776: 2020-03-15   51  change   web
#> 777: 2020-03-22   27  change   web
#> 778: 2020-03-29   20  change   web
#> 779: 2020-04-05    0  change   web
#> 780: 2020-04-12   35  change   web

Создано в 2020-04-21 пакетом представить (v0.3.0)

1 голос
/ 21 апреля 2020

Вы можете получить данные в списке, используя ls + mget, используйте lapply для перебора каждого списка и получения элемента "interest_over_time" каждого списка.

total_list <- lapply(mget(ls(pattern = 'trends\\d+')), `[[`, "interest_over_time")

total_list даст вам список данных. Лучше хранить данные в списке, так как им легче управлять и они не загромождают окружение большим количеством объектов. Однако, если вам нужны данные отдельно для каждого, мы можем использовать list2env.

list2env(total_list, .GlobalEnv)

Чтобы удалить определенные столбцы, мы можем сделать:

total_list <- lapply(mget(ls(pattern = 'trends\\d+')), function(x) {
         data <- x$interest_over_time
         data[setdiff(names(data), c("geo","category","time"))]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...