【问题标题】:rename filename with a data column用数据列重命名文件名
【发布时间】:2013-12-15 14:17:25
【问题描述】:

我希望这个问题清晰可行。我有许多标有简单数字 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?

非常感谢您的帮助。这将节省我重命名文件的时间!

【问题讨论】:

  • 你根本不需要write.table。玩弄list.filesfile.rename。那,加上一个 for 循环和 paste 应该是你所需要的。
  • ...事实上,file.rename 似乎是矢量化的,因此您可能甚至不需要 for 循环。这可能会被压缩到 2-3 行代码中。
  • @joran 谢谢你的建议。

标签: r csv apply write.table


【解决方案1】:

我已经用四个 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 的 cmets)

【讨论】:

  • 感谢您解读 joran 的 cmets。我不确定如何编写 for 循环并使用 paste()。您的代码如我的示例所示工作,但我的实际情况有点复杂。我的 ID 没有相应的 csv 文件,并且我复制了没有相应单独 ID 的 csv 文件(例如,1.csv 和 1r.csv,但数据文件中 ID 1 只有一行观察)。如何修改这段代码才能工作?
  • 我不明白“但数据文件中 ID 1 只有一行观察”部分。你能编辑你原来的问题,让它反映真正的问题吗?
【解决方案2】:

这是另一个选择:

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")))

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 2019-06-11
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2013-07-26
    相关资源
    最近更新 更多