【问题标题】:Manipulating data set using R使用 R 操作数据集
【发布时间】:2014-08-08 10:04:02
【问题描述】:

我有一堆数据 .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 个数据集可供使用。有什么帮助/方向吗?

问候 湿婆

【问题讨论】:

标签: r sorting dataset data-manipulation


【解决方案1】:

这样的?

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 以将其合并到单个数据框。

【讨论】:

  • 并非所有文件都有16行垂直行,所以skip = 16不够动态。
【解决方案2】:

我注意到您可能以不同的格式再次发布了这个问题。这是一个公共论坛,人们很乐意提供帮助。但是,简化他人的生活是您的工作,您需要付出一些努力。 Here is some advice on that.

话虽如此,这是我编写的一些代码来帮助您。

第 0 步:创建您的第一个数据集:

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

看起来不错!

第三步:保存数据:

write.table(temp,file="test-clean.txt",row.names = FALSE,sep = "\t",quote = FALSE)

检查解决方案是否有效。如果它工作正常,则进行下一步,否则进行必要的更改。

第四步:自动化:

首先,我们需要创建一个包含所有 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)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多