R: Зациклить таблицу, чтобы создать URL для дальнейшей работы? - PullRequest
0 голосов
/ 30 апреля 2018

Итак, у меня есть таблица: 100 строк и 3 столбца, и я хотел бы использовать R для создания из них строк url, которые предназначены для дальнейшей обработки.

first rows of the Table is:
X1 X2         X3
1  text1      16
2  text2      154
etc. text etc 21

Я хотел бы получить такие форматы, чтобы из первой строки было создано 16 URL-адресов в виде: baseurl + text1 + 1, baseurl + text1 + 2 и т. Д. До 16, а затем продолжить со строкой 2 тот же процесс, но затем От 1 до 154

Я представлял что-то вроде следующего, но в любом случае это не работает, я получаю пустые результаты.

    baseurl <- "link"
#creating a dynamic i which goes from 1 trough input at intersection rownumber k, column 3
    i<- 1 in a1[k,2]
# creating a loop on rownumber k from table a1    
    for (k in 1:nrow(a1)) {
# pasting together baseurl, contents at intersection row k, column 2
      mydata <- fromJSON(paste0(baseurl,a1[k,2],i,"0"), flatten=TRUE)

    }

Кто-нибудь есть предложения?

Корректировка поста:

В конце я надеюсь создать список URL-адресов, которые я могу использовать для дальнейших операций. Список URL должен выглядеть следующим образом: (Я добавил [] только для ясности из соображений чтения, поэтому они не должны появляться в конечном результате ...)

[base_url][text1][1]
[base_url][text1][2]
.
.
.
[base_url][text1][16]
[base_url][text2][1]
[base_url][text2][2]
.
.
.
[base_url][text2][154]
.
.
.
.
[base_url][text100][19]

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Я взломал эту функцию вместе, но она не красивая и не очень быстрая. Это также зависит от пары внешних пакетов.

df <- data.frame(X1 = 1:2, X2 = c("text1", "text2"), X3 = c(16,154))
base_url <- "https://www.your_url_here.com"

create_urls <- function(input_tbl, base_url) {
  require(magrittr)
  require(tidyr)
  require(dplyr)

  # create a list of numeric sequences from 1 to length specified in X3
  x3_sequences <- lapply(input_tbl$X3, FUN = seq)

  # combine the sequences with each row, this will create a list of lists.
  # be sure toe comment out/remove the "/" row after base_url if your url already
  # has it.
  url_lists <- mapply(FUN = paste0, 
                      base_url, 
                      "/", 
                      input_tbl$X2, 
                      "/", 
                      x3_sequences,
                      SIMPLIFY = TRUE)

  # jump through some hoops to turn the list of lists into a dataframe
  # with a single column of url values. I use the tidyr and dplyr packages here
  # for expediency. I'm sure it's possible to accomplish the same things in base,
  # but i'd rather not spend the time to figure out how.
  url_df <- url_lists %>%
    sapply(FUN = strsplit, split = " ", simplify = "vector") %>%
    lapply(FUN = as.data.frame) %>%
    lapply(FUN = tidyr::gather, key = "n", value = "url") %>% #this is necessary because the strsplt and as.data.frame functions cause each url to be placed in their own column. the gather turns these columns into unique rows
    do.call(rbind, .) %>% 
    dplyr::select(url)

  #row names are automatically added by the do.call rbind function above. They
  #only serve to clutter the dataframe, so I've removed them.              
  row.names(url_df) <- NULL

  return(url_df)
}

Бег create_urls(input_tbl = df, base_url = base_url) Возвращает

                                         url
1     https://www.your_url_here.com/text1/1
2     https://www.your_url_here.com/text1/2
...
15   https://www.your_url_here.com/text1/15
16   https://www.your_url_here.com/text1/16
17    https://www.your_url_here.com/text2/1
18    https://www.your_url_here.com/text2/2
...
169 https://www.your_url_here.com/text2/153
170 https://www.your_url_here.com/text2/154
0 голосов
/ 30 апреля 2018

Ваш вопрос несколько неясен, но звучит так, как будто вы хотите следующее: для каждой строки фрейма данных создайте строки вида "[base_url] / text1 / n", где "n" принимает значения от 1 до значение Х3.

Вы можете сделать это довольно легко, позвонив по номеру mapply:

df <- read.table(text = 'X1 X2 X3
1 text1 16
2 text2 154', header = T)

urls <- mapply(function(x, y) {sprintf('base_url/%s/%i', x, 1:y)}, x = df$X2, y = df$X3)

Это вернет список, каждый элемент которого содержит вектор, соответствующий значению X2, со строками, соответствующими максимальному значению X3.

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