2013-12-15 195 views
0

我希望这个问题清晰可行。我有许多标有简单数字ID的csv文件(例如1.csv,2.csv,3.csv等)。另一个CSV文件包含像下面重命名文件名与数据列

ID Site Location Block 
1 L1  1   a 
2 L2  2   b 
3 etc 

我的问题是如何将ID数据文件链接到重命名的CSV文件的实际数据。我想理想的输出是L11a.csv,L22b.csv等。我想我需要将每个行观察的站点,位置和块连接到另一列,然后使用该列作为write.table的文件名功能?

我搜索的SO这个问题是除了在相反方向的相似: When importing CSV into R how to generate column with name of the CSV?

非常感谢您的帮助。这将为重新命名文件节省数小时!

+0

根本不需要'write.table'。玩'list.files'和'file.rename'。那加上for循环和'paste'应该就是你需要的。 – joran

+0

...实际上,'file.rename'似乎是矢量化的,所以你可能甚至不需要for循环。这可能会被挤压成2-3行代码。 – joran

+0

@joran谢谢你的建议。 – user2770184

回答

2

我有模拟四个CSV文件,并在文件中的数据的情况称为info.txt与此内容:

"ID","Site","Location","Block" 
1,"L1",1,"a" 
2,"L2",2,"b" 
3,"L3",3,"c" 
4,"L4",4,"d" 

对于此设置下面的代码将实现你想要什么,如果我的理解是正确的:

x <- list.files(pattern = ".csv") 
info <- read.table(file = "info.txt", sep = ",", header = TRUE, 
        row.names = FALSE, stringsAsFactors = FALSE) 
y <- paste(info[ ,"Block" ], ".csv", sep = "") 
for(i in c("Location", "Site")) y <- paste(info[ ,i ], y, sep = "") 
file.rename(x, y) 

list.files(pattern = ".csv") 
[1] "L11a.csv" "L22b.csv" "L33c.csv" "L44d.csv" 

(大厦@ joran的评论)

+0

谢谢你解释乔兰的评论。我不知道如何编写for循环并使用paste()。你的代码按照我的例子说明了,但我的实际情况稍微复杂一点。我有ID没有相应的CSV文件,我有复制CSV文件没有相应的单独的ID(例如,1.csv和1r.csv,但只有一行数据文件中的ID 1观察)。这段代码如何修改才能工作? – user2770184

+0

我不明白“数据文件中ID 1只有一行观察”部分。你能编辑你的原始问题,以便它反映真正的问题吗? – vaettchen

1

这里的另一种选择:

info <- read.table(file = "info.txt", sep = ",", header = TRUE, row.names = NULL, 
    stringsAsFactors = FALSE) 

with(info, file.rename(paste0(ID, ".csv"), paste0(Site, Location, Block, ".csv")))