使用VBA在Excel中执行此操作非常简单,但是对于扩展数据分析,绘图功能必须使用R.该仪器的软件只输出.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包的情况下执行此操作并完成上述操作?
而不是在该列中获得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)
}
答案 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
。