使用R操纵数据集

时间:2014-08-08 10:04:03

标签: r sorting dataset data-manipulation

我有一组数据.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个数据集可供使用。任何帮助/方向?

此致 希瓦

2 个答案:

答案 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)

希望这有帮助!