Создание дополнительного цикла Dplyr - PullRequest
0 голосов
/ 12 марта 2019

Итак, у меня есть два файла с данными за один год (2015):

    Product Reporter Total_trade
    Apple   Spain        100
    Apple   France       200
    Apple   Italy        300

    Product Reporter Total_trade
    Pear    Spain        400
    Pear    France       500
    Pear    Italy        600

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

    product_index <- c("Apple","Pear")

    prody_matrix <- data.frame(matrix(vector(), 0, 2,
                                      dimnames=list(c(), c("Product", "ratio"))),
                               stringsAsFactors=F)


    for (l in product_index){
      infile <- paste("tradetotal_",l,".csv",sep="")
      sum_trade <- read.csv(infile)
      sum_trade <- sum_trade[,-1]


  k <- which(product_index==l)
  ratio_matrix[k,"Product"] <- l
  ratio_matrix[k,"ratio"] <- ratio[1,2] 
    }

Теперь у меня естьданные одних и тех же продуктов за разные годы.Как создать еще один цикл в существующем цикле, чтобы рассчитать коэффициент для разных лет?

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Использование фреймов данных из ответа @Patrick выше.

1) Строка связывает список именованных фреймов данных, где именем является год. При необходимости дополните список данными за несколько лет.

df <- bind_rows(list("2015" = apple_2015,
                     "2015" = pear_2015,
                     "2016" = apple_2016, 
                     "2016" = pear_2016), .id="year")

2) Усилить, используя dplyr

df %>% 
  spread(Product, Total_trade) %>% 
  group_by(year, Reporter) %>% 
  summarise(Apple_Pear_ratio = Apple/Pear)

# A tibble: 6 x 3
# Groups:   year [2]
  year  Reporter Apple_Pear_ratio
  <chr> <chr>               <dbl>
1 2015  France              0.4  
2 2015  Italy               0.5  
3 2015  Spain               0.25 
4 2016  France              0.5  
5 2016  Italy               0.5  
6 2016  Spain               0.667

Отредактировано для включения функции распространения

0 голосов
/ 12 марта 2019

здесь возможно решение с группировкой.Если вам нужен более общий подход, просто скажите мне.

    library(tidyverse)

# the product types
product_index <- c('Apple', 'Pear', 'Banana', 'Orange')

# the reporters
reporter_index <- c('Spain', 'France', 'Italy') 

## sample product data ----
dataList <- list(
  apple_2015 = tibble(
    Product = 'Apple',
    Reporter = reporter_index,
    Total_trade = c(100, 200, 300)

  ),

  pear_2015 = tibble(
    Product = 'Pear',
    Reporter = reporter_index,
    Total_trade = c(400, 500, 600)

  ),

  banana_2015 = tibble(
    Product = 'Banana',
    Reporter = reporter_index,
    Total_trade = c(100, 150, 600)

  ),

  orange_2015 = tibble(
    Product = 'Orange',
    Reporter = reporter_index,
    Total_trade = c(400, 500, 600)

  ),

  apple_2016 = tibble(
    Product = 'Apple',
    Reporter = reporter_index,
    Total_trade = c(200, 250, 300)

  ),

  pear_2016 = tibble(
    Product = 'Pear',
    Reporter = reporter_index,
    Total_trade = c(300, 500, 600)

  ),

  banana_2016 = tibble(
    Product = 'Banana',
    Reporter = reporter_index,
    Total_trade = c(200, 250, 300)

  ),

  orange_2016 = tibble(
    Product = 'Orange',
    Reporter = reporter_index,
    Total_trade = c(300, 500, 600)

  )
)

## calculation ----

# create merged list, add year and bind rows into one large tibble
mergedDF <- lapply(1:length(dataList), function(i) {

  dataList[[i]] %>%
    mutate(Year = parse_number(names(dataList))[i])

}

) %>%
  bind_rows() %>%
  group_by(Year, Reporter)

# function with different combinations of products
resultsDF <- (function(){

tmpList <- mergedDF %>%
  group_split()

lapply(1:length(tmpList), function(j) {

tmpDF <- tibble('Year' = unique(tmpList[[j]]$Year),
       'Reporter' = unique(tmpList[[j]]$Reporter))

tmpDF[combn(tmpList[[j]]$Product, 2, function(i) paste0(i[1], i[2]))] <- 
  combn(tmpList[[j]]$Total_trade, 2, function(i) i[1] / i[2])

return(tmpDF)

}
) %>%
  bind_rows()

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