在for循环中进行子集

时间:2014-02-01 11:10:10

标签: r loops for-loop subset

我正在研究R中的模糊匹配脚本。 在此我需要为列表中的每个国家/地区分配数据框,然后按国家/地区进行匹配。 但是,我对R中循环的了解相当低。

此脚本应返回afrocountrylist中每个国家/地区的子集。 关于如何使这个子集工作的任何建议?

谢谢!

afrobaro <- data.frame(country=rep(c("Benin","Uganda","Mali"),each=5), 
                   region=c("Benind1","Benin2","Benins3","Benina4","Benin5",
                            "Ugandat1","Ugandar2","Ugandae3","Uganda4","Uganda5",
                            "Mali1r","Mali2","Malig3","Mali4","Mali5"))

jaroloop <- function(afrobaro, afrocountry,afroregion){
  afrocountrylist <- as.vector(unique(as.character(afrobaro[, afrocountry])))
  for(i in afrocountrylist){
    x <- afrocountrylist[i]
    print(x)
    afroregions <- subset(afrobaro, afrobaro$afrocountry == x)
    print(afroregions)
  }
}

1 个答案:

答案 0 :(得分:2)

您可以使用split沿向量拆分数据框:

res <- split(afrobaro, afrobaro$country)

# $Benin
#    country  region
# 1   Benin Benind1
# 2   Benin  Benin2
# 3   Benin Benins3
# 4   Benin Benina4
# 5   Benin  Benin5
# 
# $Mali
#    country region
# 11    Mali Mali1r
# 12    Mali  Mali2
# 13    Mali Malig3
# 14    Mali  Mali4
# 15    Mali  Mali5
# 
# $Uganda
#    country   region
# 6   Uganda Ugandat1
# 7   Uganda Ugandar2
# 8   Uganda Ugandae3
# 9   Uganda  Uganda4
# 10  Uganda  Uganda5

这将返回包含三个子集的列表。您可以使用例如第一个子集的res$Beninres[[1]]来访问列表元素(子集)。

#   country  region
# 1   Benin Benind1
# 2   Benin  Benin2
# 3   Benin Benins3
# 4   Benin Benina4
# 5   Benin  Benin5

一旦您拥有子集列表,就可以使用lapply轻松地将函数应用于每个子集。


您还可以使用for循环来提取所有子集:

for (i in unique(afrobaro$country)) {
  afroregions <- afrobaro[afrobaro$country == i, ]
  print(afroregions)
}

这将打印所有子集。但请注意,每次运行都会覆盖afroregions。这与您的示例代码类似。