我有一组数据.txt数据集,其中一些是这样的,
1.0
DOO
SB009101V 222429.80 2588228.00
12
GR 1 LIN
CALI 1 LIN
NPHI 1 LIN
PHIE 1 LIN
RHOB 1 LIN
DT 1 LIN
K_AIR 2 LOG
KLINK_PERM 1 LIN
GRAIN_DENSITY 1 LIN
POR 1 LIN
Core disc 0 No 1 Yes
Perforation disc 0 No 1 Yes
222444.7 2588243.0 7381.00 -999.000 11.320 -999.000 -999.000 -999.000 -999.000 -999.000 -999.000 -999.000 -999.000 0 0
虽然这显示两行数据,但实际上只有一行,前三个数字分别表示X,Y,Z,其他数据分别对应GR CALI NPHI PHIE RHOB DT K_AIR KLINK_PERM GRAIN_DENSITY POR Core Perforation。
我想在R中使用将上述数据转换为类似
的代码Xcoord Ycoord Zcoord GR CALI NPHI PHIE RHOB DT K_AIR KLINK_PERM GRAIN_DENSITY POR Core Perforation
222444.7 2588243.0 7381.00 -999.000 11.320 -999.000 -999.000 -999.000 -999.000 -999.000 -999.000 -999.000 -999.000 0 0
忽略前4行数据,还有一些数据集缺少CALI的列名,K_AIR等无论如何都要为它们创建一个列并将NA作为值插入直到n = nrow?
到目前为止,我已设法在excel中手动编辑它们,然后根据需要通过子集操作数据,但我有超过400个数据集可供使用。任何帮助/方向?
此致 希瓦
答案 0 :(得分:0)
这样的东西?
files <- list.files(path = "path/to/data/folder", pattern = ".dat", full.names = TRUE)
data <- lapply(files, read.table, skip = 16, col.names = c("Xcoord", "Ycoord", "Zcoord", "GR", "CALI", "NPHI", "PHIE", "RHOB", "DT", "K_AIR", "KLINK_PERM", "GRAIN_DENSITY", "POR", "Core", "Perforation"))
我认为你可以在lapply周围包装一个unlist,将它合并到一个数据框中。
答案 1 :(得分:0)
我注意到您可能会再次发布此问题,并采用其他格式。这是一个公共论坛,人们乐于提供帮助。但是,简化他人生活是你的工作,你需要付出一些努力。 Here is some advice on that.
话虽如此,这里有一些我写的代码可以帮助你。
Step0:创建第一个数据集:
sink("test.txt") # This will `sink` all the output to the file "test.txt"
# Lets start with some dummy data
cat("1\n")
cat("DOO\n")
cat(c(sample(letters,10),"\n"))
cat(c(sample(letters,10),"\n"))
cat(c(sample(letters,10),"\n"))
cat(c(sample(letters,10),"\n"))
# Now a 10 x 16 dummy data matrix:
cat(paste(apply(matrix(sample(160),10),1,paste,collapse = "\t"),collapse = "\n"))
cat("\n")
sink() # This will stop `sink`ing.
我在前6行中创建了一些虚拟数据,然后是10 x 16数据矩阵。
注意:原则上您应该提供类似这样的内容或数据集的副本。这有助于其他人帮助你。
第1步:现在我们需要阅读该文件,我们希望跳过包含不需要信息的前6行:
(temp <- read.table(file="test.txt", sep ="\t", skip = 6))
Step2 :数据清理: 我们需要一个名为16列的向量:
namesVec <- letters[1:16]
现在我们将这些名称分配给data.frame:
names(temp) <- namesVec
temp
看起来不错!
第3步:保存数据:
write.table(temp,file="test-clean.txt",row.names = FALSE,sep = "\t",quote = FALSE)
检查解决方案是否正常。如果它正在工作,则转到下一步,否则进行必要的更改。
Step4 :自动化:
首先,我们需要创建所有400个文件的列表。
最简单的方法(也是解释)是将400个文件复制到目录中,然后将其设置为工作目录(使用setwd
)。
现在我们首先创建一个包含所有文件名的向量:
fileNameList <- dir()
完成后,我们需要重复步骤1到3:
convertFiles <- function(fileName) {
temp <- read.table(file=fileName, sep ="\t", skip = 6)
names(temp) <- namesVec
write.table(temp,file=paste("clean","test.txt",sep="-"),row.names = FALSE,sep = "\t",quote = FALSE)
}
现在我们只需要在我们拥有的所有文件上应用此功能:
sapply(fileNameList,convertFiles)
希望这有帮助!