R中的For循环创建一个新文件(但给出错误/意外的输出)

问题描述 投票:1回答:2

我目前正忙于处理一些数据,我需要检查它们的有效性。因此,我想使用for循环遍历所有数据文件。在这个for循环中,我想计算一些东西(比如mean,min,max ......)。

我的代码在下面工作但产生了错误编写的csv文件。在csv文件创建期间完成计算(及其值)后,会出现问题。 CSV:

"c.1..1..1004.89081855716..630.174466667434..461.738905906677.." "c.1..1..950.990843858612..479.98560814955..517.955102920532.."
1 1
1 1
1004.89081855716 950.990843858612
630.174466667434 479.98560814955
461.738905906677 517.955102920532
1535.86795806885 1452.30199813843
-13.3948961645365 3.72026950120926
1259.26423788071 1159.17089223862

方法/我期待的:所以我从一些带有眼动追踪数据的数据文件开始。正如您在代码开头所看到的,我尝试从这个眼动追踪数据中获取一些值(有效性,只有有效性的新文件== 1数据......)。一旦我创建了filtered_data数据帧,我想从中计算一些额外的值(mean,sd,min / max)。我的计划是创建一个新的csv文件(validity_loop.csv),在其中我可以找到我的所有计算(validity_left,validity_right,mean_eye_x,mean_eye_y,min_eye_x,max_eye_x,min_eye_y,max_eye_y)。一个接一个。每个数据集一行(file_list [i])。

有人可以帮我解决和解决这个问题吗?

这是我的代码:

set <- setwd("/Users/Sarah/Documents")

file_list <- list.files(set, pattern = ".csv", all.files = TRUE)
validity_list <- data_list <- vector("list", "length" = length(file_list))

for(i in seq_along(file_list)){

  filename = file_list[i]

  #read files

  data_frame = read.csv(filename, sep = ",", dec = ".", 
                        header = TRUE, 
                        stringsAsFactors = FALSE)

  #what has to be done
  #validity

  validity_left <- mean(is.numeric(data_frame$left_gaze_point_validity))
  validity_right <-mean(is.numeric(data_frame$right_gaze_point_validity))

  #Zuiver dataframe (validity ==1)

  to_keep = which(data_frame$left_gaze_point_validity == 1 &
                  data_frame$right_gaze_point_validity==1)

  filtered_data = data_frame[to_keep,]
  filtered_data$left_eye_x = as.numeric(filtered_data$left_eye_x)
  filtered_data$left_eye_y = as.numeric(filtered_data$left_eye_y)
  filtered_data$right_eye_x = as.numeric(filtered_data$right_eye_x)
  filtered_data$right_eye_y = as.numeric(filtered_data$right_eye_y)

  #1 eye-data 

  filtered_data$eye_x <- (filtered_data$left_eye_x+filtered_data$right_eye_x)/2
  filtered_data$eye_y <- (filtered_data$left_eye_y+filtered_data$right_eye_y)/2

  #Pixels 

  filtered_data$eye_x <- (filtered_data$eye_x)*1920
  filtered_data$eye_y <- (filtered_data$eye_y)*1080

  #SD and Mean + min-max

  mean_eye_x<- mean(filtered_data$eye_x)
  mean_eye_y <- mean(filtered_data$eye_y)

  sd_eye_x <- sd(filtered_data$eye_x)
  sd_eye_y <- sd(filtered_data$eye_y)

  min_eye_x <- min(filtered_data$eye_x)
  min_eye_y <- min(filtered_data$eye_y)
  max_eye_x <- max(filtered_data$eye_x)
  max_eye_y <- max(filtered_data$eye_y)

  #add everything to new file

  validity_list[[i]] <- c(validity_left, validity_right, 
                          mean_eye_x, mean_eye_y,
                          min_eye_x, min_eye_y,
                          max_eye_x, max_eye_y) 

}

#new document
write.table(validity_list, 
            file = "Master T&O/Thesis /Loop/Validity/validity_loop.csv",
            col.names = TRUE, row.names = FALSE)
r csv
2个回答
1
投票

我设法在R中获得一个新的数据框,其中包含我的validity_list的值作为矩阵形式。

#FOR LOOP poging 2 
set <- setwd("/Users/Sarah/Documents/Master T&O/Thesis /Loop")

file_list <- list.files(set, pattern = ".csv", all.files = TRUE)
validity_list <- vector("list", "length" = length(file_list))

for(i in seq_along(file_list)){
  filename = file_list[i]
  #read files
  data_frame = read.csv(filename, sep = ",", dec = ".", header = TRUE, stringsAsFactors = FALSE)
  #what has to be done
  #validity
  validity_left <- mean(is.numeric(data_frame$left_gaze_point_validity))
  validity_right <-mean(is.numeric(data_frame$right_gaze_point_validity))
  #Zuiver dataframe (validity ==1)
  to_keep = which(data_frame$left_gaze_point_validity == 1 & data_frame$right_gaze_point_validity==1)

  filtered_data = data_frame[to_keep,]
  filtered_data$left_eye_x = as.numeric(filtered_data$left_eye_x)
  filtered_data$left_eye_y = as.numeric(filtered_data$left_eye_y)
  filtered_data$right_eye_x = as.numeric(filtered_data$right_eye_x)
  filtered_data$right_eye_y = as.numeric(filtered_data$right_eye_y)
  #1 eye-data 
  filtered_data$eye_x <- (filtered_data$left_eye_x+filtered_data$right_eye_x)/2
  filtered_data$eye_y <- (filtered_data$left_eye_y+filtered_data$right_eye_y)/2
  #Pixels 
  filtered_data$eye_x <- (filtered_data$eye_x)*1920
  filtered_data$eye_y <- (filtered_data$eye_y)*1080
  #SD and Mean + min-max
  mean_eye_x<- mean(filtered_data$eye_x)
  mean_eye_y <- mean(filtered_data$eye_y)

  sd_eye_x <- sd(filtered_data$eye_x)
  sd_eye_y <- sd(filtered_data$eye_y)

  min_eye_x <- min(filtered_data$eye_x)
  min_eye_y <- min(filtered_data$eye_y)
  max_eye_x <- max(filtered_data$eye_x)
  max_eye_y <- max(filtered_data$eye_y)

  #add everything to new file
  validity_list[[i]] <- c(validity_left, validity_right,mean_eye_x, mean_eye_y, min_eye_x,max_eye_x,min_eye_y,max_eye_y)
  validity_matrix <- matrix(unlist(validity_list), ncol = 8, byrow = TRUE)
}

#new document
write.table(validity_matrix, file = "/Users/Sarah/Documents/Master T&O/Thesis /Loop/Validity/validity_loop.csv", dec = ".")

我现在唯一的问题是,我对validity_list项的值是错误的,但这是另一个问题,我正在尝试修复它!


0
投票

如果我得到它,那么以下行将所有数据一起抓取:

validity_list[[i]] <- c (validity_left, validity_right,mean_eye_x,
                         mean_eye_y, min_eye_x,max_eye_x,min_eye_y,max_eye_y). 

如果它像在python中那么我会:

validity_list = (validity_left, validity_right,mean_eye_x,
                      mean_eye_y, min_eye_x,max_eye_x,min_eye_y,max_eye_y) 

...而'='告诉解释器,它背后的一切都是一个元组'(',data,')'...这使得它成为一个单一的数据集,如果我再编写它...它将会结束在一栏中。如果你使用for循环进行选择,我会在单独的列中写入“validity_left”。在您的情况下,将此选项添加到您的下面的代码?

for item in validity_list:
         function to process item..etc.
© www.soinside.com 2019 - 2024. All rights reserved.