【问题标题】:R How to create a loop to subset dataframes for each countryR如何为每个国家/地区创建一个循环来子集数据框
【发布时间】:2014-09-11 12:14:08
【问题描述】:

我有五个数据帧:t1、t2、t3、t4、t5。所有数据框(它们具有相同的结构,只是一些值不同)都有一个具有相同数量属性的变量“国家”。

基本上我想得到一些变量 N : 对于每个国家和数据集 => 一个变量。

我的代码现在看起来是这样,但是非常繁琐且冗长:

t1.COUNTRY1 <- subset(t1, SA0100="COUNTRY1")
t2.COUNTRY1 <- subset(t2, SA0100="COUNTRY1")
t3.COUNTRY1 <- subset(t3, SA0100="COUNTRY1")
t4.COUNTRY1 <- subset(t4, SA0100="COUNTRY1")
t5.COUNTRY1 <- subset(t5, SA0100="COUNTRY1")
t1.COUNTRY2 <- subset(t1, SA0100="COUNTRY2")
t2.COUNTRY2 <- subset(t2, SA0100="COUNTRY2")
...

数据集 t1,其他看起来一样

    SA0100    DA1000   DA2100  RA0300
1   COUNTRY1  40000    45666    45
2   COUNTRY1  25456    78888    36
3   COUNTRY1  45666    12547    18
4   COUNTRY1  41255    58796    23 
5   COUNTRY1  78992    32589    28
6   COUNTRY2  12558    25556    22
7   COUNTRY2  96542    65478    78

我尝试使用循环,但没有得到任何结果,并且在这种特殊情况下我不知道如何使用 lapply() 函数。

你能帮帮我吗?

【问题讨论】:

  • t1.COUNTRY1 应该是什么样子?您想附加所有数据,使其成为一个长向量吗?还是某种汇总统计?
  • @John Paul t1.COUNTRY1 是一个用于数据分析的数据框(包含三个变量)。我会回答你的问题吗?
  • @BrunoGG 请展示一个示例数据集以产生想法
  • @akrun :我更新了问题。我可以发展更多吗?您需要更多元素吗?
  • @BrunoGG 我发布了一个解决方案。我希望它有所帮助。

标签: r loops lapply


【解决方案1】:

假设您想创建 objects(我更愿意将它放在一个列表中,而不是与大量对象杂乱无章),您可以这样做:

 list2env(unlist(lapply(mget(ls(pattern="t\\d+")), 
          function(x) split(x, x$SA0100)), recursive=FALSE), 
                                              envir=.GlobalEnv)


 t1.COUNTRY1
 #    SA0100 DA1000 DA2100 RA0300
 #1 COUNTRY1  40000  45666     45
 #2 COUNTRY1  25456  78888     36
 #3 COUNTRY1  45666  12547     18
 #4 COUNTRY1  41255  58796     23
 #5 COUNTRY1  78992  32589     28

  t3.COUNTRY2
  #  SA0100 DA1000 DA2100 RA0300
  #1 COUNTRY2  12558  25556     22
  #4 COUNTRY2  12558  25556     22

数据

 t1 <- structure(list(SA0100 = c("COUNTRY1", "COUNTRY1", "COUNTRY1", 
 "COUNTRY1", "COUNTRY1", "COUNTRY2", "COUNTRY2"), DA1000 = c(40000L, 
 25456L, 45666L, 41255L, 78992L, 12558L, 96542L), DA2100 = c(45666L, 
 78888L, 12547L, 58796L, 32589L, 25556L, 65478L), RA0300 = c(45L, 
 36L, 18L, 23L, 28L, 22L, 78L)), .Names = c("SA0100", "DA1000", 
 "DA2100", "RA0300"), class = "data.frame", row.names = c("1", 
 "2", "3", "4", "5", "6", "7"))

  t2 <- structure(list(SA0100 = c("COUNTRY2", "COUNTRY2", "COUNTRY1"), 
  DA1000 = c(96542L, 96542L, 45666L), DA2100 = c(65478L, 65478L, 
  12547L), RA0300 = c(78L, 78L, 18L)), .Names = c("SA0100", 
 "DA1000", "DA2100", "RA0300"), row.names = c(NA, 3L), class = "data.frame")

  t3 <- structure(list(SA0100 = c("COUNTRY2", "COUNTRY1", "COUNTRY1", 
  "COUNTRY2", "COUNTRY1"), DA1000 = c(12558L, 78992L, 41255L, 12558L, 
  40000L), DA2100 = c(25556L, 32589L, 58796L, 25556L, 45666L), 
  RA0300 = c(22L, 28L, 23L, 22L, 45L)), .Names = c("SA0100", 
  "DA1000", "DA2100", "RA0300"), row.names = c(NA, 5L), class = "data.frame")

【讨论】:

    【解决方案2】:

    此脚本使用循环并在名为 country 的列表中对国家进行子集化,假设国家 1 出现在 t1 中,国家 2 出现在 t2 中等等。如果国家也出现在其他数据集中(例如,国家 1 在数据集 2 中),则应该更改脚本的最后一行(更改 t1、t2 等中的 tcp)。

    a=5 # number of iterations, datasets t1:t5
    
    tch<-paste0(rep("t",each=a), c(1:a))
    cch<-paste0(rep("Country",each=a), c(1:a))
    country<-list()
    
    for (i in 1:a)
    {tcp<-get(tch[i])
    country[[i]] <- (subset(tcp, SAO100==cch[i]))}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 2020-04-28
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多