2

我有一个文本文件包含(头):

"Grid.Point.Index" "Latitude" "Longitude" "Cell"
"544361" 2093507 40.071983 0 1322
"545570" 2098421 40.184559 0 1322
"545571" 2098423 40.184559 0.146776 1322
"546781" 2103327 40.297134 0 1322
"546782" 2103329 40.297134 0.14702 1322
"546784" 2103333 40.297134 0.294039 1322

读取文件:

table= read.table("C:\\Users\\lonlatnter.txt", sep=",",header=TRUE)

第二列中的每个数字在另一个文件夹中都有一个关联的文件data。我在这个文件夹中有数千个文件,称为"data".

列出文件:

data<- list.files("D:\\data", "*.csv", full.names = TRUE)

这些文件被命名为(示例)data_num_gp2103333.csv

之后名称中的数字gp对应于文本文件中的第二列。

我只想将文本文件第二列中存在数字的文件从文件夹移动(或复制)data到新文件夹mydata。请有任何帮助。

str( table )

'data.frame':   374 obs. of  4 variables:
$ Grid.Point.Index: int  2093507 2098421 2098423 2103327 2103329 2103333 2108225 2108227 
                         2108231 2113115 ...
$ Latitude        : num  40.1 40.2 40.2 40.3 40.3 ...
$ Longitude       : num  0 0 0.147 0 0.147 ...
$ Cell            : int  1322 1322 1322 1322 1322 1322 1322 1322 1322 1322 ...
4

1 回答 1

2

你可以试试下面的例子。首先,我们循环遍历Index你的每个值table(旁注 - 有一个函数被调用table(),所以我会避免调用变量 this)。我们列出了包含这个索引值的文件。我假设每个索引值都与单个文件有关。在这种情况下,我们返回一个文件名的字符向量。

接下来我们遍历文件名,将每个文件复制到文件夹"D:/NewData"(必须已经存在于您的驱动器上)。该文件将具有原始文件名,只是在一个新文件夹中。我为此使用for循环,因为 a) 循环的执行时间与执行循环所需的时间相比可以忽略不计,file.copy并且 b) 因为我们要求file.copy它的副作用(从/到指定位置复制文件)而不是它是返回值(表示复制是否成功的逻辑)。

fls <- sapply( table[,2] , function(x) list.files( path = "D:\\data"  , pattern = as.character( x ) , full.names = TRUE ) )

#  Use a 'for' loop here because we are calling the
#  file.copy function for it's side effect rather
#  than return value (i.e. to copy a file)
for( i in fls ){
    file.copy( from = i , to = paste0( "D:/NewData/" , basename( i ) ) )
}
于 2013-09-20T16:06:38.117 回答