【问题标题】:Looping through data frames and plotting graphs循环遍历数据框并绘制图表
【发布时间】:2019-02-04 15:04:47
【问题描述】:

我在 RStudio 工作,试图制作一些简单的图表和相关性。这可能是一个超级简单的修复,但我似乎无法遍历我的文件并生成绘图。有关文件、循环和示例数据框,请参见下文

> ls()
 [1] "let-7b-5p"     "let_7a_5p"     "miR_125b_5p"   "miR_16_5p"    "miR_182_5p"    "miR_21_5p"    "miR_30e_5p"    "miR_320c_2_3p" "miR_92a_1_3p"  "miR_92b_3p"
[10]  "rRNA-45S"      "tRNA_3p_1"    "tRNA_5p_2"    
> files <- ls()
> for(i in files){
+   plt <- ggplot(`i`, aes_string(x="Five", y = "Three")) +
+       geom_point(shape=16) +
+       geom_smooth(method=lm) 
+   print(plt)
+   pearson <- cor.test(`i`$Five, `i`[, "Three"], method = "pearson", conf.level = 0.95)
+   print(pearson)
+ }
Error: `data` must be a data frame, or other object coercible by `fortify()`, not a character vector
> print(`let-7b-5p`)
       Five        Three       One
A      14.06       13.14       13.62
B      14.45       14.64       14.21
C       7.84       10.23        8.05
D      12.84       13.13       13.07
E      16.55       15.97       16.01
F      12.92       12.02       12.37

我知道它将“文件”视为字符向量,但我不确定为什么在传递给循环时会出现问题。

【问题讨论】:

  • 您想使用ls()(带有对象名称的character 向量)来制作图表吗?如果是这样,您必须将 ls() 对象解析为 evalparse。例如第一个对象:eval(parse(text = ls()[1]))
  • 我不需要使用 ls(),但我已经导入了我的文件(带有一个单独的循环),我需要一种方法来列出它们以传递给图形循环。跨度>
  • 在您的示例中,filesls()。以class(files[1]) 为例,检查它返回给您的内容。 “let-7b-5p”不同于`let-7b-5p`

标签: r loops ggplot2


【解决方案1】:

当函数(此处为ggplot)需要data.frame 时,将字符串作为字符向量传递将无法在循环中工作,原因与在循环外无法工作的原因相同...R 没有不知道从全局环境中检索给定名称的对象。

我建议(类似于@patL 的评论)检索对象然后运行循环:

for(i in files){
  dat <- get(i) # new line
  plt <- ggplot(dat, aes_string(x="Five", y = "Three")) + 
  ...
}

应该注意ls() 将返回环境中所有对象的字符向量,无论它们的类如何,因此如果您定义了其他任何内容,您可能会遇到问题。从外观上看,您可能可以使用 ls()pattern 参数来确保您至少返回与特定模式匹配的对象名称向量。

【讨论】:

  • 添加 get(i) 成功了,我现在明白错误了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多