【问题标题】:Creating new dataframes and applying a function in R, for loops创建新的数据框并在 R 中应用函数,for 循环
【发布时间】:2018-08-11 23:22:02
【问题描述】:

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

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")

谢谢。我一直在尝试使用带有 unique(weights$Region) 的 for 循环来填充这 7 个数据帧。

【问题讨论】:

  • 您能分享一份reproducible 的数据副本吗?
  • 如果这 7 个区域是所有区域,您可以使用 split() 将您的数据框切割成更小的数据框(每个更小的数据框都存储为一个列表元素)。然后你可以lapply()你的treemap变量到每个:
  • 感谢 Dan,效果很好!

标签: r for-loop dplyr


【解决方案1】:

简而言之,split 将您的数据按区域划分为子集,lapplytreemap 函数分配给每个子集:

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

更新:哎呀!该问题要求以“有效”的方式编写代码,而我的 lapply 的 2-liner 输给了 2 个 for 循环、cbindassign 的答案。好吧,你能做什么...... :)

【讨论】:

  • 您可能必须添加 as.factor 以确保正确拆分:)
  • split 会为您执行 as.factor(),但我同意通常最好是明确的。
  • 好的,我在某些时候遇到了类型为字符的问题,但我猜最新的 R 可以很好地处理它。
【解决方案2】:

类似这样的:

    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) 
        } 

【讨论】:

    【解决方案3】:

    正如其他人所说,很难弄清楚,CRAN 上也没有 d3treeR 包,所以我不确定这是否可行。使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 2014-03-31
      • 2016-05-09
      相关资源
      最近更新 更多