【问题标题】:Python list-comprehension in R?R中的Python列表理解?
【发布时间】:2012-01-04 13:37:57
【问题描述】:

我想要这个在 R 中:

fsC=[read.table(x) for x in Sys.glob('./Trial7/*.csv')]

即试图将每个文件的内容读取到一个单独的向量中,其中向量属于数据结构。

Python

[file(x, 'r').read() for x in glob.glob('./Trial7/*.csv')]

实际上更好

[file(x, 'r') for x in glob.glob('./Trial7/*.csv')]

但我认为你明白了......

【问题讨论】:

  • 路径中不需要"./"。 R 应该相对于当前工作目录。

标签: python r list-comprehension


【解决方案1】:

您有两个问题。首先,“给定一个文件名向量,如何将这些文件读入 R?”。

这是您的文件名列表

trial7_files <- Sys.glob("Trial7/*.csv") 
#if you prefer to specify the names using regular expressions, try 
trial7_files <- dir("Trial7", "\\.csv$")

如前所述,lapply 是读取文件的最佳方式。

fsC <- lapply(trial7_files, read.csv)

这将为您提供数据框列表,并引出您的下一个问题。 “如何将具有相同列的数据框列表合并到一个数据框中?”

执行此操作的标准方法是使用 do.callrbind。首先,记下每个数据集中有多少行很有用。

n_records <- sapply(fsC, nrow)
fsC <- do.call(rbind, fsC)

这就是你的问题解决了,虽然你可能想要一列告诉你每行来自哪个文件。

fsC$source <- rep(trial7_files, n_records)

【讨论】:

  • +1,您可以通过添加以下行来添加有关数据源的信息:names(trial7_files)
  • @WojciechSobala:是的,我从那个开始,但是那些行名是编号的(而不是每个来源的相同值),我认为将来源作为一个因素会更有用。
  • Error in match.names(clabs, names(xi)) : names do not match previous names Calls: do.call -&gt; &lt;Anonymous&gt; -&gt; rbind -&gt; match.names fsC &lt;- do.call(rbind, fsC)
【解决方案2】:

使用 sapply 来“映射”向量:

sapply(Sys.glob('./Trial7/*.csv'), read.table) -> fsc

【讨论】:

  • ...这种拼图怎么样? data.frame(Sys.glob('./Trial7/*.csv'), Sys.glob('./Trial7/*.csv'))-&gt;y; sapply(y,read.table),需要加入吗?合并太慢了...如何将其用于更复杂的结构? Python [...] 是那里的杀手...
  • ...或者sapply(Sys.glob('./Trial7/*.csv'), read.table) -&gt; fsc; [log(x[2]) for x in fsC],你怎么能在 R 中做到这一点?
  • 由于每种情况下的返回值都是data.frame,因此无法将输出简化为向量,因此sapply在这里返回与lapply相同的内容。
  • @RichieCotton: x[2] 选择每个读取文件的第二列,log 取每个列值的对数——然后 [...] 将每个带有向量的文件返回到数据结构.我们理解的方式一样吗? (我做这个例子是因为我应该用很多sapply(sapply(sappaly(sapply(....)))))(闻起来很臭)来处理这个问题吗?...或者只是sapply(s[2,], log),但它是否结合了这些结构?
  • 试图保持这个干净,移动它here
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2017-02-17
  • 1970-01-01
  • 2018-03-18
  • 2016-11-18
相关资源
最近更新 更多