R - Как запустить вложенные циклы над списком переменных и их значений - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь запустить функцию, которая принимает имя фильтра и значение файла в качестве входных данных.

get_rules <- function(data_set, filter_col, filter_value) {
    *do something*
    return (list(df1, df2))
}

Я должен запустить это для набора столбцов с различными значениями.

year = c(2018,2019,2020)
region = c('AMER', 'APAC', 'EMEA')

Я пытаюсь запустить эту функцию в al oop для всех различных значений в каждом списке. Для этого мне нужно передать имя переменной и значения переменной, которую я пытаюсь запустить вложенным l oop.

columns = list(year, region )

df_a <- data.frame()
df_b <- data.frame()

for (i in columns){
  print("out loop ")
  print(i)
  for (j in i){
    print("in loop ")
    print(i)
    print(j)
    #df_loop <- user_func(df, i, j)
    #df_a <- rbind(df_a, df_loop[1])
    #df_b <- rbind(df_b, df_loop[2])
  }
}

>> Output is
[1] "out loop "
[1] 2018 2019 2020
[1] "in loop "
[1] 2018 2019 2020
[1] 2018
[1] "in loop "
[1] 2018 2019 2020
[1] 2019
[1] "in loop "
[1] 2018 2019 2020
[1] 2020
[1] "out loop "
[1] "AMER" "APAC" "EMEA"
[1] "in loop "
[1] "AMER" "APAC" "EMEA"
[1] "AMER"
[1] "in loop "
[1] "AMER" "APAC" "EMEA"
[1] "APAC"
[1] "in loop "
[1] "AMER" "APAC" "EMEA"
[1] "EMEA"

Я - нативный пользователь python, и он довольно сильно продвинулся в python, но я не могу написать это в R.

>> Output required is 
[1] "out loop "
[1] 'year'
[1] "in loop "
[1] 2018
[1] "in loop "
[1] 2019
[1] "in loop "
[1] 2020
[1] "out loop "
[1] "region"
[1] "in loop "
[1] "AMER"
[1] "in loop "
[1] "APAC"
[1] "in loop "
[1] "EMEA"

Ответы [ 2 ]

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

Ваше решение будет работать - немного изменено - если вы будете использовать data.frame вместо списка, и если вы будете перебирать имя столбца data.frame во внешнем l oop (или вы также можете придерживайтесь списка, добавляйте имена и просматривайте список имен):

year = c(2018,2019,2020)
region = c('AMER', 'APAC', 'EMEA')
columns = data.frame(year, region )

for (i in names(columns)) {
  print("out loop")
  print(i)
  for (j in columns[[i]]) {
    print("in loop")
    print(j)
  }
}
1 голос
/ 06 апреля 2020

Ваш требуемый вывод не имеет смысла в сочетании с данным вводом (то есть columns = list(year, region )).

Вы хотите напечатать (в соответствии с вашим требуемым выводом) out loop 'region', однако у вас нет регион или год в вашем списке / df. Здесь указаны только фактические значения года и региона. Это вызвано тем, как вы создаете свой список. Мне не ясно, являются ли ваши настоящие данные безымянными или действительно имеют правильное имя. Тем не менее, вы не можете распечатать что-то, чего нет в данных. Чтобы решить эту проблему, я добавил имена:

names(columns) <- c("year","region")

или просто сделал это при создании списка:

columns = list(year = year, region =region )

Когда вы теперь сделаете меня равным имени столбцов, вы получит либо год, либо регион, которые можно напечатать так, как вы указали в требуемом выводе. Однако, поскольку i теперь равно имени (а не значениям, как в вашем примере), вы не можете выбрать j в i. Ну, технически вы можете, но это не имеет смысла, потому что j будет равно i. Вместо этого вы хотите выбрать значения столбцов для списка i. Так как мы изменим обе эти вещи в ваших циклах for, вы получите:

 for (i in names(columns)){
     print("out loop ")
     print(i)
     for (j in columns[[i]]){
         print("in loop ")
         print(j)
     }
}

Это даст:

[1] "out loop "
[1] "year"
[1] "in loop "
[1] 2018
[1] "in loop "
[1] 2019
[1] "in loop "
[1] 2020
[1] "out loop "
[1] "region"
[1] "in loop "
[1] "AMER"
[1] "in loop "
[1] "APAC"
[1] "in loop "
[1] "EMEA"

Я не знаю, почему у вас print("in loop ") print(i) print(j) во второй l oop вашего исходного примера, так как он не соответствует требуемому выводу (а также делает print("out loop") print(i) немного избыточным IMO). Вы все еще могли бы это сделать, но это дало бы:

[1] "out loop "
[1] "year"
[1] "in loop "
[1] "year"
[1] 2018
[1] "in loop "
[1] "year"
[1] 2019
[1] "in loop "
[1] "year"
[1] 2020
[1] "out loop "
[1] "region"
[1] "in loop "
[1] "region"
[1] "AMER"
[1] "in loop "
[1] "region"
[1] "APAC"
[1] "in loop "
[1] "region"
[1] "EMEA"

Некоторые личные предпочтения, хотя: я не знаю точно, почему вы хотите напечатать это, но для циклов относительно медленно, особенно когда вы их вкладываете или когда ваши данные становятся больше. Вы можете легко применить функцию, просто используя apply или map и записав результаты в новый столбец или назначив его как объект для среды.

...