代码之家  ›  专栏  ›  技术社区  ›  Antarqui

创建新的数据帧并在R中应用函数for循环

  •  1
  • Antarqui  · 技术社区  · 7 年前

    我有一个名为“weights”的数据集,我想知道编写以下代码的最有效方法是什么:

    library(d3treeR)
    library(treemap)
    library(dplyr)
    
    myfun <- function(x){
     x <- weights %>% filter(Region %in% x) 
    }
    
    CAN<-myfun("Canada")
    ON<-myfun("Ontario")
    NL<-myfun("Newfoundland and Labrador")
    PE<-myfun("Prince Edward Island")
    NS<-myfun("Nova Scotia")
    NB<-myfun("New Brunswick")
    QC<-myfun("Quebec")
    
    CAN=treemap(CAN, index=c("Level.0","Level.1"), vSize="X2015", type="index")
    ON=treemap(ON, index=c("Level.0","Level.1"), vSize="X2015", type="index")
    NL=treemap(NL, index=c("Level.0","Level.1"), vSize="X2015", type="index")
    PE=treemap(PE, index=c("Level.0","Level.1"), vSize="X2015", type="index")
    NS=treemap(NS, index=c("Level.0","Level.1"), vSize="X2015", type="index")
    NB=treemap(NB, index=c("Level.0","Level.1"), vSize="X2015", type="index")
    QC=treemap(QC, index=c("Level.0","Level.1"), vSize="X2015", type="index")
    

    谢谢您。我一直试图使用for循环和unique(weights$Region)来填充这7个数据帧。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Nar    7 年前

    像这样的:

        x <- c("CAN",  "ON",  "NL", "PE", "NS", "NB", "QC")
        weights <- as.data.frame(cbind(weights=rep(c(1,2,3), 7), Region=x))
    
        for(i in x){
          y <- weights[weights$Region == i, ]
          assign(i, y) 
        } 
    

    如果是你的话

    x <- c("CAN",  "ON",  "NL", "PE", "NS", "NB", "QC")     
    for(i in x){
              y <- treemap(weights[weights$Region == i, ], index=c("Level.0","Level.1"), vSize="X2015", type="index")
              assign(i, y) 
            } 
    
        2
  •  2
  •   DanY    7 年前

    split 您的数据按区域和 lapply treemap 各功能:

    mylist <- split(weights, weights$Region)
    result <- lapply(mylist, treemap::treemap, index=c("Level.0","Level.1"), vSize="X2015", type="index")
    

    更新: 哎呀!这个问题要求以“高效”的方式编写代码,我的2行程序 以2输给了一个答案 for cbind ,和 assign

        3
  •  1
  •   Phil    7 年前

    正如其他人所说,很难搞清楚,还有 d3treeR CRAN上没有软件包,所以我不确定这是否有效。使用 purrr::map()

    library(tidyverse)
    library(d3treeR)
    
    myfun <- function(weights, Region, x){
      weights %>% 
        filter(Region %in% x) %>%
        treemap(index=c("Level.0","Level.1"), vSize="X2015", type="index")
    }
    
    Regions <- c("Canada", "Ontario", "Newfoundland and Labrador", "Prince Edward Island", "Nova Scotia", "New Brunswick", "Quebec")
    
    results <- map(Regions, myfun, weights = weights, Region = Region)