我有包含多行的文件,我想通过从文件名中提取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
有什么想法吗?谢谢
答案 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的长度重复它们。