2012-01-04 85 views
1

我想这在R:R列表中的Python列表理解?

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')] 

,但我觉得你有一点......

+0

你不需要''./“'在路径中。 R应该看起来相对于当前的工作目录。 – 2012-01-04 14:04:20

回答

5

使用sapply到 “地图” 载体:

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

...这种谜题呢? data.frame(Sys.glob('.// Trial7/*。csv'),Sys.glob('./ Trial7/*。csv')) - > y; sapply(y,read.table)',需要一些连接?合并太慢......你怎么能用更复杂的结构来使用它? Python' [']'是一个杀手锏... – hhh 2012-01-04 13:54:56

+0

...或者sapply(Sys.glob('.// Trial7/*。csv'),read.table) - > fsc; [fsC]中的x [log(x [2]),你怎么能在R中做到这一点? – hhh 2012-01-04 13:59:22

+0

由于每种情况下的返回值都是'data.frame',因此不能将输出简化为一个向量,所以'sapply'在这里返回与'lapply'相同的东西。 – 2012-01-04 14:02:01

7

这里有两个问题。首先,“给定一个文件名向量,你如何将这些文件读入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) 
+0

+1,您可以通过添加行来添加有关数据源的信息:names(trial7_files)< - trial7_files和名称将填充到data.frame的rownames中。 – 2012-01-04 17:30:34

+0

@WojciechSobala:是的,我从那开始,但那些rownames被编号(而不是每个来源的相同值),我认为将源作为一个因素会更有用。 – 2012-01-04 17:35:58

+0

'匹配错误。名称(clab,名称(xi)): 名称与以前的名称不匹配 调用:do.call - > - > rbind - > match.names'在'fsC < - do.call(rbind,fsC )'。 – hhh 2012-01-04 22:58:18