我想在R中做下面的事情。
我有类似于下面示例的色谱数据的250+ csv文件,但是有21行而不是3行:
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个文件中的一个子集读取到一个数据框架中,这很容易--但我也需要对其进行合理的重构。
上表中的每一行都是一个峰值。我只需要来自第一列和第四列的数据(分别是“峰值数”和“峰值下的区域”),在输出中,我需要使每个峰值成为单独的列,而不是像上面这样的一行,以峰值号作为标题。最后,我希望创建一个新列,其中每一行(即来自每个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我希望我已经说得够清楚了。我已经能够管理大部分步骤,但没有成功地将它们编写成一个脚本。如果有任何方法,我也不知道如何将文件名变成变量。
干杯
发布于 2015-12-18 04:49:45
我假设工作目录设置为文件所在的位置。然后你可以得到下面的文件列表。
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发布于 2015-12-18 04:44:19
下面的代码可能会有所帮助,尽管文件名仍然不能正常工作-
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)
}请注意,这并不是非常漂亮的代码--只是为了完成任务而进行了一些黑客攻击(从分散在各处的多个打印行中可以看到)。
发布于 2015-12-18 04:47:53
这是你的解决办法。只有当我们可以假设每个文件中正好有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)
}
}
datahttps://stackoverflow.com/questions/34347823
复制相似问题