从R中的文件名中提取varible

时间:2016-11-01 20:21:01

标签: r variables filenames

我有包含多行的文件,我想通过从文件名中提取varibles并将它们乘以当前行来添加我创建的两个新行。 例如,我有一堆文件名为这样的

file1[1000,1001].txt

file1[2000,1001].txt
[]之间的

总是有两个用逗号表示的数字

文件本身有多个列,例如column1& column2

我希望每个文件在文件名中提取2个值,然后将它们用作变量,以创建2个使用该变量修改值的新列。

例如

file1[1000,2000]

该文件包含两列

column1    column2
1             2
2             4

我希望最后将第一个文件名值添加到第1列以创建column3,并将第二个文件名值添加到第2列以创建第4列,最后得到类似这样的内容

column1  column2 column3 column4
1            2     1001     2002
2            4     1002     2004

感谢您的帮助。我几乎只有几个问题 原始文件有2列" X_Parameter" " Y_Parameter",文件名为" test(64084,4224).txt 你的代码在提取两个值V1" 64084"和V2" 4224"从文件名。然后,我将这些值添加到原始数据集。这产生4列。 " X_Parameter" " Y_Parameter" " V1" " V2&#34 ;.

setwd("~/Desktop/txt/")
txt_names = list.files(pattern = ".txt")
for (i in 1:length(txt_names)){assign(txt_names[i], read.delim(txt_names[i]))
DS1 <- read.delim(file = txt_names[i], header = TRUE, stringsAsFactors = TRUE)
require(stringr)
remove_text <- str_extract(txt_names, pattern = "\\[[0-9,0-9]+\\]")
step1 <- gsub("(\\[)", "", remove_text)
step2 <- gsub("(\\])", "", step1)
DS2<-as.data.frame(do.call("rbind", (str_split(step2, ","))))
DS1$V1<-DS2$V1
DS1$V2<-DS2$V2

我的问题出现在追求总结&#34; X_Parameter&#34;和&#34; V1&#34;制作&#34; absoluteX&#34;和&#34; Y_Parameter&#34;与&#34; V2&#34;制作&#34; absoluteY&#34;对于每一行。

下面是我尝试过的两种错误方法

DS1$absoluteX<-DS1$X_Parameter+DS1$V1

错误 在Ops.factor(DS1 $ X_Parameter,DS1 $ V1)中:'+'对因子无意义

其他尝试是

DS1$absoluteX<-rowSums(DS1[,c(“X_Parameter”,”V1”)])

错误 rowSums中的错误(DS1 [,c(&#34; X_Parameter&#34;,&#34; V1&#34;)]):&#39; x&#39;必须是数字

我尝试过使用

as.numeric(DS1$V1) 

导致所有值变为1

有什么想法吗?谢谢

2 个答案:

答案 0 :(得分:2)

您可以从文件名向量中提取数字,如下所示(不确定它是最短的代码,但似乎有效)

fnams<-c("file1[1000,2000].txt","file1[1500,2500].txt")
opsqbr<-regexpr("\\[",fnams)
comm<-regexpr(",",fnams)
clsqbr<-regexpr("\\]",fnams)
reslt<-data.frame(col1=as.numeric(substring(fnams,opsqbr+1,comm-1)),
                  col2=as.numeric(substring(fnams,comm+1,clsqbr-1)))
reslt

哪个收益

  col1 col2
1 1000 2000
2 1500 2500

拥有此数据框后,可以轻松顺序读取文件并执行添加

答案 1 :(得分:0)

## set path to wherever your files are
setwd("path")

## make a vector with names of your files
txt_names <- list.files(pattern = ".txt") # use this to make a complete list of names



## read your files in
for (i in 1:length(txt_names)) assign(txt_names[i], read.csv(txt_names[i], sep = "whatever your separator is"))


## for now I'm making a dummy vector and data frame
txt_names <- c("[1000,2000]")
ds1 <- data.frame(column1 = c(1,2), column2 = c(2,4))


## grab the text you require from the file names
require(stringr)

remove_text <- str_extract(txt_names, pattern = "\\[[0-9,0-9]+\\]")
step1 <- gsub("(\\[)", "", remove_text)
step2 <- gsub("(\\])", "", step1)

## step2 should look like this
> step2

[1] "1000,1001"

## split each string and convert to data frame with two columns 
ds2 <- as.data.frame(do.call("rbind", (str_split(step2, ","))))

## cbind with the file
df <- cbind(ds1, ds2)

## coerce factor columns to numeric
df$V1 <- as.numeric(as.character(df$V1))
df$V2 <- as.numeric(as.character(df$V2))

## perform the operation to change the columns

df$V1 <- df$column1 + df$V1
df$V2 <- df$column2 + df$V2

您是否拥有包含两列的data.frame,每列包含您需要的文件名部分。只需按照每个data.frames和cbind的长度重复它们。