如何读取head(-er)较少的ASCII,使用R标识特定的行?

时间:2017-04-08 05:12:17

标签: r dataframe plot ascii

使用VBA在Excel中执行此操作非常简单,但是对于扩展数据分析,绘图功能必须使用R.该仪器的软件只输出.csv文件,没有标题。必须单独阅读以进行分析。

我想做什么(需要做):

  • 读取多个没有标题的.csv(4列)。每个文件只能按名称区分,仅限名称。
  • 从每个文件中选择几个特定的​​行。例如第一列的行 value = 101,列值= 201等。每个文件只有500行。我觉得这里需要循环读取特定行(?)
  • 将上述值存储到所有文件的数据框中
  • 计算一些统计数据
  • 绘制统计结果
  • 最后输出数据框,统计分析,绘制成Excel,.csv

我已经尝试过如何使用R读取.csv,存储到数据框中,对数据框项目和绘图执行分析。每个仪器运行每天重复该过程流程。我跑两个乐器。我想保存每次都可以运行的代码段。

我面临的唯一问题是,我不确定如何找到这些特定的行。下一个问题是如何将输出转换为Excel。

.csv输入文件格式:

V1, V2, V3, V4
numeric (0 decimals), numeric (with 4 decimals), alpha num, alpha num
001, 12.8975, XY03, XY05
...
485, 89.2134, XY02, XY7

更新1: 由于仪器sw发生了一些变化,files are in ASCII format而不是CSV。这带来了很多局限。面临安装raster包以支持ASCII的问题。改为使用以下内容。安装sqldf包以支持sql。但是这会产生错误。

> fl1 <- read.table("~/rcodes/dt07042017/fileone.ASC", sep=",") 
--read ok
> sv1 <- sqldf('select FNAME "F1", V2, V3, V4 from fl1 where V1 in (101, 201, 301)') 
Warning message: Quoted identifiers should have class SQL, use DBI::SQL() 
if the caller performs the quoting.

然后安装了DBI包。不知道它做了什么。 sql工作。这只是一个文件,我需要读取1000个文件,选择特定的行值并将它们保存到一个表/ df中。写下以下的断线。它失败了,因为我无法找到注入文件名的方法。

> df <- NULL
> fn <- NULL
> n <- 1
> for (f in files) {
+     fn <- file_path_sans_ext(f)
+     df0 <-read.table(f, sep=",")
+     n <- n + 1
+     df <- sqldf('select n, fn, V1, V2 from df0 
where V1 IN (101, 201, 301, 401)') 
-- thought R could read fn just as df0
+     df <- rbind(df) --further fn and n only reads two files
+ }
Error in rsqlite_send_query(conn@ptr, statement) : 
no such column: n, df1

我不是非常高兴在R上使用sql。在R中有没有其他方法可以在不使用sql包的情况下执行此操作并完成上述操作?

更新3

而不是在该列中获得2:20值(18个值),我想得到第2行的平均值为20.我该怎么做?

#set working directly to the folder where csv files are located
files <- list.files(pattern='.csv')
m = data.frame()
 for (k in 1:length(files)){
  +     csv = read.csv(files[k], header = FALSE)
  #picking up 2:20 consecutive values, value for row 50,120,150 so on
  +     data = csv[c(2:20, 50, 120, 150, 175, 200), c(1,2)]
  #-pivot transform col/row- data <- as.data.frame(t(data))
  #but that line screwed up the data
  #when those selected values are with NA/blanks
        data$file = files[k]
  +     m = rbind(m, data)
 }

1 个答案:

答案 0 :(得分:1)

我不太明白你的意思&#34; ASCII文件&#34;。希望以下内容与您的问题非常相似。假设您有以下文件:

档案1.csv

101 0.8117 AFWSK QSZDP
099 0.4594 MDKKK DHVAH
301 0.8730 HMRCR PQSMB
012 0.4705 OHHZL CIKVM
012 0.1335 KKEHQ YFNJU
201 0.2967 XFIPZ PMNYT
301 0.2470 WKLIV TBHZP
101 0.9182 SSEHT QYBUW
101 0.8076 VKRSO BUGJL
301 0.5861 PICFN UFTWC

文件2.csv

201 0.0767 FHWLL FZKQF
301 0.3176 HDBVJ EIUNJ
301 0.9606 LHODD XRYFE
301 0.8327 NKGVT LYTUJ
012 0.8073 KOBXD GBEFA
099 0.9414 ZCOCX ENFAV
101 0.3683 UTBUG RKIQU
012 0.1515 XXJZI MEWVI
012 0.0383 IUKQQ PAIFV
301 0.2304 GKIKJ GEOZT

存储在名为path/to/my/dir的目录中。假设此目录还包含其他文件,但您知道包含数据的文件是[0-9]+.csv格式的名称(即某个数字,后跟.csv)。当然你有很多人,他们的名字可能不同;由于这个问题并没有包含任何关于此的提示,我只是提供一个例子,希望您可以根据实际问题调整此步骤。

现在:

#you get the name of all files. No manual typing.
filenames<-list.files(path="path/to/my/dir",pattern="[0-9]+\\.csv",full.names=TRUE)
#reading them all
dataFiltered<-sapply(filenames,function(x) {
                    y<-read.table(x)
                    y[y[[1]] %in% c(101, 201, 301),]},simplify=FALSE)
finalRes<-cbind(do.call(rbind,dataFiltered),
           fileOrigin=rep(names(dataFiltered),vapply(dataFiltered,nrow,1L)))

获得类似的内容:

#    V1     V2    V3    V4 fileOrigin
#1  101 0.8117 AFWSK QSZDP      1.csv
#2  301 0.8730 HMRCR PQSMB      1.csv
#3  201 0.2967 XFIPZ PMNYT      1.csv
#4  301 0.2470 WKLIV TBHZP      1.csv
#5  101 0.9182 SSEHT QYBUW      1.csv
#6  101 0.8076 VKRSO BUGJL      1.csv
#7  301 0.5861 PICFN UFTWC      1.csv
#8  201 0.0767 FHWLL FZKQF      2.csv
#9  301 0.3176 HDBVJ EIUNJ      2.csv
#10 301 0.9606 LHODD XRYFE      2.csv
#11 301 0.8327 NKGVT LYTUJ      2.csv
#12 101 0.3683 UTBUG RKIQU      2.csv
#13 301 0.2304 GKIKJ GEOZT      2.csv

以上应该可行,但可能会耗费内存。如果你有大量的文件,我建议你一起阅读它们并将上面的内容应用到每一堆文件中。这意味着您不会将所有filenames对象传递给sapply,但每次都可以传递一部分,直到完成为止。

最后,您rbind一起finalRes