我有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")
}
然而,我尝试过的任何事都没有奏效。是否有任何技巧或功能可以帮助?感谢您的帮助和想法。
答案 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
。我个人认为dplyr
和tidyverse
更容易用于大多数任务。
<强> P.P.S:强>
关于使用tidyverse
:https://www.youtube.com/watch?v=rz3_FDVt9eg