计算R中两个csv之间的值

时间:2017-07-19 20:10:24

标签: r string csv

我有一个两个数据表(csv),其中包含有关MOOC课程的信息。

第一个表包含有关鼠标移动(距离)的信息。像这样:

1-2163.058../2-20903.66351.../3-25428.5415..

第一个数字表示发生的日期(第一天,第一天,第二天等),第二个数字表示像素的距离。 (2163.05820903.66351等。)

第二个表包含相同的信息但不是距离,而是记录了时间。像这样:

1-4662.0/2-43738.0/3-248349.0....

第一个数字表示发生的日期(第一天,第一天,第二天等),第二个数字表示以毫秒为单位的时间。

在表格中,每列都记录来自特定网页的数据,每一行都记录此页面上的用户行为。

我想创建一个具有相同阵型的新表,我想逐个像素地计算速度。将距离表除以时间表,给出具有相同顺序,形状的新表。

以下是两个表的两个链接goo.gl/AVQW7D goo.gl/zqzgaQ

如何使用raw csv执行此操作?

> dput(distancestream[1:3,1:3]) 

structure(list(id = c(2L, 9L, 10L),
               `http//tanul.sed.hu/mod/szte/frontpage.php` = structure(c(2L,  1L, 1L), 
                                                                       .Label = c("1-0", "1-42522.28760403924"), 
                                                                       class = "factor"), 
               `http//tanul.sed.hu/mod/szte/register.php` = c(0L, 0L, 0L)), 
          .Names = c("id", "http//tanul.sed.hu/mod/szte/frontpage.php",  
                     "http//tanul.sed.hu/mod/szte/register.php"), 
          class = c("data.table", 0x0000000002640788))


> dput(timestream[1:3,1:3]) 

structure(list(id = c(2L, 9L, 10L), 
              `http//tanul.sed.hu/mod/szte/frontpage.php` = structure(c(2L,  1L, 1L), 
                                                                      .Label = c("0", "1-189044.0"), 
                                                                      class = "factor"),
              `http//tanul.sed.hu/mod/szte/register.php` = c(0L,  0L, 0L)), 
         .Names = c("id", 
                    "http//tanul.sed.hu/mod/szte/frontpage.php",  
                    "http//tanul.sed.hu/mod/szte/register.php"), 
         class = c("data.table", 0x0000000002640788))

Picture of two rows from first and second table

1 个答案:

答案 0 :(得分:0)

这可能不是最有效的方法,但我相信它应该会产生您正在寻找的结果。

# Set file paths
  dist.file <- # C:/Path/To/Distance/File.csv
  time.file <- # C:/Path/To/Time/File.csv

# Read data files
  dist <- read.csv(dist.file, stringsAsFactors = FALSE)
  time <- read.csv(time.file, stringsAsFactors = FALSE)

# Create dataframe for speed values
  speed <- dist
  speed[,2:ncol(speed)] <- NA

# Create progress bar
  pb <- txtProgressBar(min = 0, max = ncol(dist) * nrow(dist), initial = 0, style = 3, width = 20)
  item <- 0

# Loop through all columns and rows of distance data
  for(col in 2:ncol(dist)){
    for(r in 1:nrow(dist)){
      # Check that current item has data to be calculated
      if(dist[r,col] != 0 & dist[r,col] != "1-0" & !is.na(time[r,col])){
        # Split the data into it's separate day values
        dists <- lapply(strsplit(strsplit(dist[r,col], "/")[[1]], "-"), as.numeric)
        times <- lapply(strsplit(strsplit(time[r,col], "/")[[1]], "-"), as.numeric)

        # Calculate the speeds for each day
        speeds <- sapply(dists, "[[", 2) / sapply(times, "[[", 2)

        # Paste together the day values and assign to the current item in speed dataframe
        speed[r,col] <- paste(sapply(dists, "[[", 1), format(speeds, digits = 20), sep = "-", collapse = "/")
      } else{
        # No data to calculate, assign 0 to current item in speed dataframe
        speed[r,col] <- 0
      }

      # Increase progress bar counter
      item <- item + 1
      setTxtProgressBar(pb,item)
    }
  }

# Create a csv for speed data
  write.csv(speed, "speed.csv")