用循环编写连续文件

时间:2014-02-15 18:03:23

标签: r serialization for-loop write.table

我正在编写一个函数,打开dir()中的所有文件,进行一些计算和重新排列,然后在dir()中再次写入(write.table)每个文件

dir()
 [1] "v2p1"  "v2p10" "v2p11" "v2p12" "v2p2"  "v2p3"  "v2p4"  "v2p5"  "v2p6"  "v2p7" 
[11] "v2p8"  "v2p9"  "v2r1"  "v2r10" "v2r11" "v2r12" "v2r2"  "v2r3"  "v2r4"  "v2r5" 
[21] "v2r6"  "v2r7"  "v2r8"  "v2r9"  "v2s1"  "v2s10" "v2s11" "v2s12" "v2s2"  "v2s3" 
[31] "v2s4"  "v2s5"  "v2s6"  "v2s7"  "v2s8"  "v2s9" 

代码看起来像这样,除了循环不起作用外,它完成了一切。

mysub <- function(x) {sub(",",".",x)}
abrir<-function(etapa){  
### volnum c(1:10) indica en qué vol quiero,
### etapa c("p","r","s") indica en qué etapa es del experimento

i<-1
for (i in dir()){

##### ABRIR ARCHIVOS DESDE DIR() ######
Archivo<-paste(getwd(),"/",i,sep="")
r1<-read.table(Archivo,fill=T,sep=",")

##### CALCULAR LA VELOCIDAD DE CADA CORRIDA ######
r11 <- (apply(r1, 2, mysub ))
r1<- data.frame(apply(r11, 2, as.numeric)) ## ojo que pueden aparecer NA
R1<-r1[1:3136,]     ### OJO, DEPENDE LA CORRIDA, SACA LOS VALORES DEL FINAL QUE NO SIRVEN
V<-data.frame(rbind(c(0,0,0,0),(abs(diff(as.matrix(R1[,2:5]))))))
Tiempo<-R1[,1]
Velocidad<-data.frame(Tiempo,V)  

##### GUARDAR LAS VELOCIDADES QUE CORRESPONDEN  ######

if (grep("p",i)==TRUE){
salida<-paste("VEL",i,".txt",sep="")
write.table(Velocidad,salida,sep="\t",row.names=FALSE)
} else if (grep("r",i)==TRUE){
salida<-paste("VEL",i,".txt",sep="")
write.table(Velocidad,salida,sep="\t",row.names=FALSE)
}else if(grep("s",i)==TRUE){
salida<-paste("VEL",i,".txt",sep="")
write.table(Velocidad,salida,sep="\t",row.names=FALSE)
}else stop("etapa inválida")
i<-i+1
}
}

abrir()为我保存了正确的“VELv2p1.txt”并返回此错误 i + 1中的错误:二元运算符的非数字参数

我不知道如何解释R继续第二个元素一旦完成i = 1我想我&lt; -i + 1它不是那样的。我很感激你的帮助。

1 个答案:

答案 0 :(得分:1)

错误消息与您的循环中的icharacter个对象而非numeric的事实有关。语法for(i in dir())生成i中的实际文件,而不是索引。在使用for这样的情况下,无需将i设置为下一个项目,for循环将采用该项。因此,只需删除i <- i + 1即可解决您的问题。

关于您的代码的一些评论:

  • 缩进将提高代码的可读性。和添加空格一样。
  • 您可以在函数末尾调用write.table,从而为您节省三行完全相同的代码。实际上,if语句集似乎都执行相同的代码。
  • for循环通常不是R中的最佳选项。矢量化或基于apply的解决方案会产生更短,有时更快的代码。

我大致采取以下方法:

list_of_files = list.files('.')
do_some_calculations = function(file, output_name) {
    output_name = sprintf('VEL%d.txt', list_of_files)
    Archivo<-paste(getwd(), "/", i, sep = "")
    r1<-read.table(Archivo,fill = T, sep = ",")
    r11 <- (apply(r1, 2, mysub ))
    r1<- data.frame(apply(r11, 2, as.numeric)) ## ojo que pueden aparecer NA
    R1<-r1[1:3136,]     ### OJO, DEPENDE LA CORRIDA, SACA LOS VALORES DEL FINAL QUE NO SIRVEN
    V <- data.frame(rbind(c(0,0,0,0), (abs(diff(as.matrix(R1[,2:5]))))))
    Tiempo <- R1[,1]
    Velocidad <- data.frame(Tiempo, V)  
    write.table(Velocidad, output_name,s ep="\t", row.names=FALSE)
}