R:有选择地将数据从多个 csv 文件导入单个数据框,同时还将数据从行更改为单独的列
R: selectively importing data from several csv files into single data frame while also changing data from rows to individual columns
我希望在 R 中执行以下操作。
我有 250 多个色谱数据的 csv 文件,其结构类似于下面的示例,但有 21 行而不是三行:
1 4.708252 BB 9.946890 7.830349 0.01982016 4.684836 4.742056
2 4.970352 BB 1.792341 1.497008 0.01896829 4.945352 5.005390
3 6.393414 BB 6.599891 5.309925 0.01950091 6.368413 6.428723
我想做的是将所有 250 个文件中的数据子集读取到一个数据框中,这很容易 — 但我还需要对其进行一些重组。
上面table中的每一行都是一个峰。我只想要来自第一列和第四列的数据(分别是“峰数”和“峰下面积”),并且在输出中我需要将每个峰作为一个单独的列,而不是像上面那样的一行,峰值编号为header。最后,我想创建一个新列,其中每一行(即来自每个单独的 csv 文件的数据)的名称都与 csv 文件名相同。
所以,假设我有 3 个文件:ABC1.csv、ABC2.csv 和 ABC3.csv。每个文件看起来都像我上面的例子。我想自动获取所有这些文件并将它们合并到一个数据框中,如下图所示。
ID 1 2 3
ABC1 9.94689 1.792341 6.599891
ABC2 9.76651 1.932332 6.600022
ABC3 8.99193 2.556471 6.718934
希望我已经说得够清楚了。我已经能够管理大部分步骤,但未能成功将它们写入单个脚本。而且我不知道如何(如果有的话)将文件名变成一个变量。
干杯
以下代码可能会有一些帮助,但文件名仍然无法正常工作 -
path <- "C:\Users\Vidyut\"
filenames <- list.files(path = path,pattern = ".csv")
l <- data.frame(ID=character(),col1=numeric(),col2=numeric(),col3=numeric(),stringsAsFactors=FALSE)
for (i in filenames) {
#i = filenames[1]
full = paste(path,i,sep="")
m <- read.csv(full, header=F)
# extract the subset of rows required from each file
# m <- m[c(),]
n<- m[,c(1,4)]
y <- gsub('.csv','',i)
print("y=")
print(y)
d <- list(ID=as.character(y),col1=n[1,2],col2=n[2,2],col3=n[3,2])
print("d=")
print(d)
l <- rbind.data.frame(l,d)
print("l=")
print(l)
}
请注意,这不是非常漂亮的代码 - 只是为了完成工作而组合在一起的代码(从分散在各处的多条打印行可见)。
这里有一个解决方案。这仅在我们可以假设每个文件中恰好有 21 个峰并且它们按顺序 1:21 时才有效。如果不是这种情况,对代码进行一些更改应该可以解决这个问题。
folder = "c:/temp/"
files <- dir(folder)
first_loop <- TRUE
for (file in files) {
# Read one file, only the first and fourth columns
temp <- read.csv(file=paste0(folder,file),
header = FALSE,
colClasses = c("integer", "NULL", "NULL", "numeric", "NULL", "NULL", "NULL", "NULL"))
# Transpose the data
temp <- data.frame(t(temp))
# Remove the peak number
temp <- temp[2,]
# Concatenate the dataframes together
temp$file <- file
if (first_loop) {
data <- temp
first_loop <- FALSE
} else {
data <- rbind(data, temp)
}
}
data
我假设工作目录设置为文件所在的位置。然后你可以得到下面的文件列表。
filenames <- list.files()
有一个辅助函数来读取文件并只保留第 1 列和第 4 列。
readdata <- function(filename) {
df <- read.csv(filename)
vec <- df[, 4]
names(vec) <- df[, 1]
return(vec)
}
遍历所有文件并rbind
它们
result <- do.call(rbind, lapply(filenames, readdata))
随意命名
row.names(result) <- filenames
我希望在 R 中执行以下操作。
我有 250 多个色谱数据的 csv 文件,其结构类似于下面的示例,但有 21 行而不是三行:
1 4.708252 BB 9.946890 7.830349 0.01982016 4.684836 4.742056
2 4.970352 BB 1.792341 1.497008 0.01896829 4.945352 5.005390
3 6.393414 BB 6.599891 5.309925 0.01950091 6.368413 6.428723
我想做的是将所有 250 个文件中的数据子集读取到一个数据框中,这很容易 — 但我还需要对其进行一些重组。
上面table中的每一行都是一个峰。我只想要来自第一列和第四列的数据(分别是“峰数”和“峰下面积”),并且在输出中我需要将每个峰作为一个单独的列,而不是像上面那样的一行,峰值编号为header。最后,我想创建一个新列,其中每一行(即来自每个单独的 csv 文件的数据)的名称都与 csv 文件名相同。
所以,假设我有 3 个文件:ABC1.csv、ABC2.csv 和 ABC3.csv。每个文件看起来都像我上面的例子。我想自动获取所有这些文件并将它们合并到一个数据框中,如下图所示。
ID 1 2 3
ABC1 9.94689 1.792341 6.599891
ABC2 9.76651 1.932332 6.600022
ABC3 8.99193 2.556471 6.718934
希望我已经说得够清楚了。我已经能够管理大部分步骤,但未能成功将它们写入单个脚本。而且我不知道如何(如果有的话)将文件名变成一个变量。
干杯
以下代码可能会有一些帮助,但文件名仍然无法正常工作 -
path <- "C:\Users\Vidyut\"
filenames <- list.files(path = path,pattern = ".csv")
l <- data.frame(ID=character(),col1=numeric(),col2=numeric(),col3=numeric(),stringsAsFactors=FALSE)
for (i in filenames) {
#i = filenames[1]
full = paste(path,i,sep="")
m <- read.csv(full, header=F)
# extract the subset of rows required from each file
# m <- m[c(),]
n<- m[,c(1,4)]
y <- gsub('.csv','',i)
print("y=")
print(y)
d <- list(ID=as.character(y),col1=n[1,2],col2=n[2,2],col3=n[3,2])
print("d=")
print(d)
l <- rbind.data.frame(l,d)
print("l=")
print(l)
}
请注意,这不是非常漂亮的代码 - 只是为了完成工作而组合在一起的代码(从分散在各处的多条打印行可见)。
这里有一个解决方案。这仅在我们可以假设每个文件中恰好有 21 个峰并且它们按顺序 1:21 时才有效。如果不是这种情况,对代码进行一些更改应该可以解决这个问题。
folder = "c:/temp/"
files <- dir(folder)
first_loop <- TRUE
for (file in files) {
# Read one file, only the first and fourth columns
temp <- read.csv(file=paste0(folder,file),
header = FALSE,
colClasses = c("integer", "NULL", "NULL", "numeric", "NULL", "NULL", "NULL", "NULL"))
# Transpose the data
temp <- data.frame(t(temp))
# Remove the peak number
temp <- temp[2,]
# Concatenate the dataframes together
temp$file <- file
if (first_loop) {
data <- temp
first_loop <- FALSE
} else {
data <- rbind(data, temp)
}
}
data
我假设工作目录设置为文件所在的位置。然后你可以得到下面的文件列表。
filenames <- list.files()
有一个辅助函数来读取文件并只保留第 1 列和第 4 列。
readdata <- function(filename) {
df <- read.csv(filename)
vec <- df[, 4]
names(vec) <- df[, 1]
return(vec)
}
遍历所有文件并rbind
它们
result <- do.call(rbind, lapply(filenames, readdata))
随意命名
row.names(result) <- filenames