【问题标题】:R: How do I use a for loop to mutate & group_by multiple data framesR:如何使用 for 循环来改变和 group_by 多个数据帧
【发布时间】:2020-03-21 10:13:30
【问题描述】:

我对 R 非常熟悉,但在 for 循环方面完全是新手。

基本上,我对 1977 年至 2015 年的当前人口调查数据进行了大约 5000 万次观察,我希望:

A)。按年份对所有数据进行子集

B)。用多个新变量改变所有子集的 dfs

C)。 group_by 州 ID,并总结该州在该特定年份的几个变量的平均值

D)。将我的新汇总数据重新组合在一起

手动执行此操作没有任何问题,但它非常重复,我希望使我的代码更高效。这是我如何手动实现它的示例:

FinalCPS<- load.csv("CPS")

CPS1977 <- FinalCPS %>% filter(YEAR==1977)

CPS1977 <- CPS1977 %>% mutate(newvar = ..)

CPS1977 <- CPS1977 %>% group_by(STATEID) %>%  summarise(mean(var1),mean(var1))

欢迎任何帮助。

【问题讨论】:

  • 您还应该按Year 分组,而不是一一过滤。 CPS1977 %&gt;% group_by(STATEID, YEAR) %&gt;% summarise(mn = mean(var1)

标签: r


【解决方案1】:

这可能看起来有点复杂,将几个 SO 帖子拼凑在一起,因此可能不是最有效的方法,而是下载多个人口普查文件并将它们读入表格的一种方法:

y<-1985
f<-"~/data/"
if (!dir.exists(f)) {dir.create(f)}
setwd(f)
while (y < 2016)  {
      y=y+1
      ty=substr(y,3,4)
      url<-paste0("https://www2.census.gov/programs-surveys/cbp/datasets/",y,"/cbp",ty,"st.zip")
      p<-basename(url)
      if (!file.exists(p)) {download.file(url = url,
                                          destfile = p,mode="wb")}
      library(plyr)
      # get all the zip files
      zipF <- list.files(path = f, pattern = "*.zip", full.names = TRUE)

      # unzip all your files
      ldply(.data = zipF, .fun = unzip, exdir = f)

      # clean up
      delfiles <- dir(path=f ,pattern=".zip")
      file.remove(file.path(f, delfiles))
}

list_of_files <- list.files(path = ".", recursive = TRUE,
                            pattern = "\\.txt$", 
                            full.names = TRUE)
library(data.table)

# Read all the files and create a FileName column to store filenames
DT <- rbindlist(sapply(list_of_files, fread, simplify = FALSE),
                use.names = TRUE, idcol = "FileName")

你必须做最后的努力才能得到你想要的组手段。

【讨论】:

    【解决方案2】:

    您可以在 group_by 中添加更多变量,如果您有大型数据集,则不需要 for 循环。 你可以试试这样的累积总和。

    library(data.table)
    df <- data.table(df)
    df[, Newvar1:= cumsum(var1), by = c("STATEID","YEAR")]
    

    这使得处理大型数据集的方式更加有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      相关资源
      最近更新 更多