如何为多个数据集创建for循环

时间:2016-12-03 22:04:15

标签: r for-loop dataset character

我有30个数据集,它们都是相同的,仅适用于不同的公司。我想要的是为所有人完成一些基本任务,重复每个命令30次是非常苛刻的。我认为创建for循环会很好。但是,正如我发现的那样,for循环不能用于字符变量。我试图谷歌任何东西或尽可能多地重写循环,但它没有带来任何令人满意的结果。

我将展示相关函数的一个例子。

companies<-c("a", "b", "c")
for(i in companies){
  correlations=cor(x = [i][4], y = [i][5],use="pairwise.complete.obs", method = "pearson")
}

这应该创建2个不同变量的相关矢量。我试图使用额外的代码行:

for(i in companies){
  e=paste(i)
  correlations=cor(x = e[4], y = e[5],use="pairwise.complete.obs", method = "pearson")
}

然而,我尝试过的任何事都没有奏效。是否有任何技巧或功能可以帮助?感谢您的帮助和想法。

1 个答案:

答案 0 :(得分:2)

这里有多个错误:

<强> 1。让我们从一般的for - 循环结构开始:

companies<-c("a", "b", "c")
for(i in c){

c应该在这里? c未定义,因此 R 会将c解释为函数c(请参阅?c),我相信您不会这样做。

因此for循环总是需要循环:列表,向量......我想你的意思是

companies<-c("a", "b", "c")
for(i in companies){

<强> 2。如何处理数据/公司:

您尝试按[i]获取数据。这对 R 没有意义。通常[用于子集化,因为您正确地使用[4]来解决第四列问题。我想你想要的是获得名为&#34; a&#34;,&#34; b&#34;的全局变量。或&#34; c&#34;正如您在companies中定义的那样。为此,请使用get(i)

假设您的全局环境中有3个变量(例如,如果您键入a,则会打印出来的数据......)您可以这样做:

companies<-c("a", "b", "c")
for(i in companies){
  cor(x = get(i)[4], y = get(i)[5],use="pairwise.complete.obs", method = "pearson")
}

逐一打印所有这些。

第3。如何将结果保存在矢量中? 你这样做的方式

for(i in companies){
  correlations = ...
}

在循环的每次迭代中correlations都会分配一个新值。所以你最终correlations是最后一家公司的相关性。

要保存结果,您可以执行以下操作:

companies <- c("a", "b", "c")
correlations <-  vector("double", length = length(companies))
names(correlations) <- companies
for(i in companies){
  correlations[i] <- cor(...) # the above code
}

现在correlations是一个具有所有相关性的命名向量。

<强>&GT;&GT;&GT;如何改进?

如果要对多个相同结构对象(例如您的公司)执行相同的操作,最好将这些对象保存在列表中,然后对列表对象进行操作。这可以通过以下方式完成:

dat <- mget(companies)
my_cor <- function(x){
  cor(x = x[4], y = x[5], use="pairwise.complete.obs", method = "pearson")
}
sapply(dat, my_cor) # gives you the list of your correlations

<强>&GT;&GT;&GT;如何进一步改善这一点:

使用dplyr包,如下所示:

require(dplyr)
dat <- mget(companies)
dat <- bind_rows(dat, .id="company")

现在dat是一个包含所有公司信息的大数据框架。     dat%&gt;%       group_by(公司)%&gt;%       总结(correlations = cor(VARIABLE_NAME_1,VARIABLE_NAME_2,使用=&#34; pairwise.complete.obs&#34;,方法=&#34; pearson&#34;)

有关dplyr - 套餐https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html的详情,请参阅此处。

<强> P.S:

dplyr的替代方案是data.table。我个人认为dplyrtidyverse更容易用于大多数任务。

<强> P.P.S: 关于使用tidyversehttps://www.youtube.com/watch?v=rz3_FDVt9eg

管理多个模型的精彩演讲